smc*_*smc 1 scripting sed awk shell-script text-processing
我有一个文本文件;其内容如下。
$ cat file.txt
[] [1]foo1 bar1
[] [2]foo2 bar2
[] [35]foo3 bar3
[] [445]foo4 bar4
[] [87898]foo5 bar5
Run Code Online (Sandbox Code Playgroud)
我可以使用 awk 成功删除第一列,但我无法删除 [num] 个字符,因为它与字符串关联。
我正在尝试获得如下输出
$ cat file.txt
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
Run Code Online (Sandbox Code Playgroud)
$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
Run Code Online (Sandbox Code Playgroud)
Thesed删除行上的所有内容(包括) final ],并将tr多个连续空格压缩为单个空格。
或者,仅使用sed:
sed -e 's/.*]//' -e 's/ */ /g' file.txt
Run Code Online (Sandbox Code Playgroud)
使用给定的输入数据,这会产生与第一个管道相同的输出。
这sed首先会s/.*]//删除直到](包括)的所有内容。第二个表达式匹配??*,即一个空格后跟零个或多个空格,并用一个空格替换它们。第二个表达式应用于整行并具有与 相同的效果tr -s ' ',即将多个连续空格压缩为单个空格。
使用awk:
awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt
Run Code Online (Sandbox Code Playgroud)
在这里,我们使用]或 空格或制表符作为字段分隔符(它们的倍数可能会分隔两列,这就是我们*在 之后使用的原因[...])。给定这些分隔符,所需数据在每行的字段 3 和 4 中可用。
在编辑问题中的数据以删除最后两列之间的一些空格后,以下内容也将完成这项工作:
cut -d ']' -f 3 file.txt
Run Code Online (Sandbox Code Playgroud)
或者只是
sed 's/.*]//' file.txt
Run Code Online (Sandbox Code Playgroud)
或者
awk -F ']' '{ print $3 }' file.txt
Run Code Online (Sandbox Code Playgroud)