使用sed清除输出

时间:2019-06-25 17:21:10

标签: bash sed cat

我有一个以这种格式开头的文件

INFO|NOT-CLONED|/folder/another-folder/another-folder|last-folder-name|

我需要读取文件并获取以下输出:

INFO|NOT-CLONED|last-folder-name

到目前为止,我已经拥有了:

cat clone_them.log | grep 'INFO|NOT-CLONED' | sed -E 's/INFO\|NOT-CLONED\|(.*)/g'

但是无法正常工作

注意:最后一个“另一个文件夹”和“最后一个文件夹名称”相同

2 个答案:

答案 0 :(得分:1)

awk中它更简单,因为输入文件由|符号正确分隔。您需要告诉awk,输入字段之间用|隔开,并且输出也应该分别使用|IFSOFS符号分开。

awk 'BEGIN{FS=OFS="|"}/INFO\|NOT-CLONED/{print $1,$2,$(NF-1)}' clone_them.log
INFO|NOT-CLONED|last-folder-name

答案 1 :(得分:1)

如果要使用sed解决方案:

$ sed -En 's/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\1\2/p' file
INFO|NOT-CLONED|last-folder-name

工作原理:

  • -E

    使用扩展的正则表达式

  • -n

    除非我们明确告知,否则请不要打印。

  • s/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\1\2/p

    查找包含INFO|NOT-CLONED|(将其保存在组1中),后跟.*,后跟|和后跟任何非|,{{ 1}}(保存在组2中),然后在行的末尾插入[^|]*。替换文本为第1组,然后是第2组。

    |选项告诉sed如果匹配成功,则打印行。由于仅对包含p的行替换成功,因此无需进行额外的INFO|NOT-CLONED|处理。

变化:仅返回姓氏文件夹

要只获取grep而没有last-folder-name,我们只需从输出中删除INFO|NOT-CLONED

\1

由于我们不再需要第一个捕获组,因此我们可以简化并删除现在不需要的parens,以便唯一的捕获组是最后一个文件夹名称:

$ sed -En 's/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\2/p' file
last-folder-name