我有一个文本文件;其内容如下。
$ cat file.txt
[] [1]foo1 bar1
[] [2]foo2 bar2
[] [35]foo3 bar3
[] [445]foo4 bar4
[] [87898]foo5 bar5
我可以使用 awk 成功删除第一列,但无法删除 [num] 个字符,因为它与字符串关联。
我正在尝试获得如下所示的输出
$ cat file.txt
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
答案1
$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
删除sed
行中直到(并包括)最后一个 的所有内容]
,并将tr
多个连续空格压缩为单个空格。
或者,仅使用sed
:
sed -e 's/.*]//' -e 's/ */ /g' file.txt
使用给定的输入数据,这会产生与第一个管道相同的输出。
sed
首先执行此s/.*]//
操作会删除(包括)之前的所有内容]
。第二个表达式匹配␣␣*
,即一个空格后跟零个或多个空格,并将它们替换为单个空格。第二个表达式应用于整行并具有与 相同的效果tr -s ' '
,即将多个连续空格压缩为单个空格。
使用awk
:
awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt
在这里,我们使用]
或 空格或制表符作为字段分隔符(其中的多个可以分隔两列,这就是我们*
在 后面使用的原因[...]
)。有了这些分隔符,所需的数据就可以在每行的字段 3 和 4 中获得。
编辑问题中的数据以删除最后两列之间的一些空格后,以下操作也可以完成这项工作:
cut -d ']' -f 3 file.txt
或者只是
sed 's/.*]//' file.txt
或者
awk -F ']' '{ print $3 }' file.txt
答案2
您可以使用sed
$ sed -e 's/.*]//g' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
您可以使用`awk
$ awk -F'.*]' '{print $2}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
答案3
使用 awk:
$ awk '{$2=substr($2,index($2,"]")+1);print $2,$3}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
第二个参数$2
是使用substr
第一个]
找到的参数截断的。然后打印参数 2 和 3。
答案4
另一个 awk 提案
awk '{gsub(/\[.+foo|\]/,"foo")}1' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5