我有一个像这样的文件
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