grep一个模式并输出一行不匹配的部分

Den*_*nis 6 unix bash shell grep

我知道可以用-v标志反转grep输出.有没有办法只输出匹配线的非匹配部分?我问因为我想使用grep的返回码(sed不会有).这是我所得到的:

tags=$(grep "^$PAT" >/dev/null 2>&1)
[ "$?" -eq 0 ] && echo $tags 
Run Code Online (Sandbox Code Playgroud)

Dav*_* W. 10

你可以使用sed:

$ sed -n "/$PAT/s/$PAT//p" $file
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,只要模式好,它就会返回退出代码0,即使找不到模式也是如此.


说明

-n参数告诉sed不要打印出任何行.Sed的默认设置是打印出文件的所有行.让我们看一下sed斜杠之间程序的每个部分.假设该程序是/1/2/3/4/5:

  1. /$PAT/:这表示要查找匹配模式的所有行$PAT以运行替换命令.否则,sed即使没有替代,也会在所有线路上运行.
  2. /s/:这表示你将进行替换
  3. /$PAT/:这是你要替代的模式.是的$PAT.所以,你正在搜索包含的行,$PAT然后你将用模式代替某些东西.
  4. //:这就是你要替代的$PAT.它是null.因此,您要删除$PAT该行.
  5. /p:这个决赛p说要打印出这条线.

从而:

  • 您告诉sed不要在处理文件时打印出文件的行.
  • 您正在搜索包含的所有行$PAT.
  • 在这些行上,您使用s命令(替换)来删除模式.
  • 一旦从线上移除图案,就会打印出线条.


Fre*_*ihl 6

如何使用的组合grep,sed$PIPESTATUS得到正确的退出状态?

$ echo Humans are not proud of their ancestors, and rarely invite
  them round to dinner | grep dinner | sed -n "/dinner/s/dinner//p"
Humans are not proud of their ancestors, and rarely invite them round to 

$ echo $PIPESTATUS[1]
0[1]
Run Code Online (Sandbox Code Playgroud)

$PIPESTATUS数组的成员保存在管道中执行的每个相应命令的退出状态.$PIPESTATUS[0]保持管道中第一个命令$PIPESTATUS[1]的退出状态,第二个命令的退出状态,等等.