我有一个字符串
.....((((...)))...((((..))))....
我想拥有
.....((((...)))...
和...((((..))))....
分开..
我想出了/[.(]*(.?)[.)]*/
哪些输出
.....((((...)))...
和((((...)))...
请注意,我希望在第一次切割中位于右端的三个点也出现在第二次切割的左侧。
任何输入表示赞赏!
$ cat file
.....((((...)))...((((..))))....
$ sed -r 's/([^)]+[)]+([^(]+))/\1 \2/' file
.....((((...)))... ...((((..))))....
或者如果您的 sed 不支持 ERE(-r 选项),那么您可以执行以下操作:
$ sed 's/\([^)]*[)]*\([^(]*\)\)/\1 \2/' file
.....((((...)))... ...((((..))))....
语义有点不同(* = 零或更多,而 + = 1 或更多)但你的例子似乎没问题。
编辑:按要求解释:
sed -r ' # use sed with Extended Regular Expressions enabled so "+" works.
s/ # search command and search start delimiter
( # start of 1st saved RE-matching string (\1 later) which will contain:
[^)]+ # 1 or more non-) characters (e.g. "."s) then
[)]+ # 1 or more )s then
( # start of 2nd saved RE-matching string (\2 later) which will contain:
[^(]+ # 1 or more non-) characters (e.g. "."s)
) # end of 2nd saved RE-matching string so by this point \2 = "..."
) # end of 1st saved RE-matching string so by this point \1 = ".....((((...)))..."
/ # search end delimiter and replacement start delimiter
\1 \2 # print \1=".....((((...)))..." then a space then \2="..." then the remaining unmatched input text="((((..))))...."
/ # replacement end delimiter
' file # operate on the contents of file "file"
我认为你必须分 3 步完成。原因是你中间的“...”在两个输出中都很常见,我怀疑它在单个正则表达式命令中的可能性。注意:我使用的是“.(.)”。参考您的特定字符串输出模式。
第 1 步:匹配“.(.)”。并返回第一个输出。
第 2 步:匹配第一个“.(.)”并将其从字符串中删除。
第 3 步:将第 2 步中剩余的字符串与“.(.)”匹配。并返回其输出。
我在 rubular.com 上玩过它,我得到的正则表达式与你的不同。
/(.*(+.*)+.*)(.*(+.*)+.*)/ 这不是你想要
的 /(.*(+.*)+.*)/ 这将匹配一个个人 ”。(。)。”
HM1 是对的,你不能在 RE 中匹配两次一些字符。一个想法是单独匹配公共部分并在之后连接。gawk 的一个例子:
echo "begin(first round bracket)middle(second round bracket)end" | gawk 'match($0, /^([^)]+\))([^(]+)(.+)$/, a) { first=a[1] a[2]; second=a[2] a[3]; print first "\n" second }'