如何使用 sed 将前两个单词保留在最后一个出现的 [] 中



我有一个像这样的文件

one two three [four five] six seven [eight nine ten yeah]   
new york [los angeles houston]    
usa canada [mexico costa rica] brasil [yes no]

我想将前两个单词保留在最后一对 []:

eight nine
los angeles
yes no

我已经尝试了几个命令,但它不起作用。谁能给我一些建议?谢谢!

awk应使用自定义字段分隔符:

awk -F'[][]' '{split($(NF-1), a, " "); print a[1], a[2]}' file
eight nine
los angeles
yes no
  • 正则表达式[][]使[]字段分隔符
  • NF-1将为您提供[]之间的最后一条短信
  • split函数用于按空格拆分文本。
sed -ne 's/^.*[([^ ]* [^ ]*)[^]]*][^][]*$/1/p'

也就是说:通过一组方括号替换整个行,这些方括号后面没有任何方括号,用括号内的前两组非空格和它们之间的空格替换。

^行首

.*任意数量的字符,包括 0;完全匹配将由可以匹配表达式其余部分的内容来确定。

[文字开放括号

(......)的意思是"记住与表达式的这一部分匹配的行部分"。

[^ ]* [^ ]*的意思是"任意数量的非空格字符,后跟一个空格,后跟任意数量的非空格字符"。 换句话说:正好两个字。

[^]]*匹配任意数量的非右括号字符 - 因此,所有内容都包括右括号。

]与右括号本身匹配。

[^][]*$匹配行尾除括号以外的任何内容。 这样可以防止表达式与行前面的一组括号匹配。

所以我们搜索它,然后将其替换为 1 ,这是与第一对(之间的表达式部分匹配的行部分......) - 括号中的前两个单词。

类似

$ sed -r 's/.*[([^ ]+) ([^] ]+).*/1 2/' input
eight nine
los angeles
yes no

$ sed -r 's/.*[([^] ]+) ?([^] ]*).*/1 2/' input

最新更新