删除文本文件中的某些字符

删除文本文件中的某些字符

我有一个文本文件;其内容如下。

$ 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

相关内容