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:
/$PAT/:这表示要查找匹配模式的所有行$PAT以运行替换命令.否则,sed即使没有替代,也会在所有线路上运行./s/:这表示你将进行替换/$PAT/:这是你要替代的模式.是的$PAT.所以,你正在搜索包含的行,$PAT然后你将用模式代替某些东西.//:这就是你要替代的$PAT.它是null.因此,您要删除$PAT该行./p:这个决赛p说要打印出这条线.从而:
sed不要在处理文件时打印出文件的行.$PAT.s命令(替换)来删除模式.如何使用的组合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]的退出状态,第二个命令的退出状态,等等.
| 归档时间: |
|
| 查看次数: |
11043 次 |
| 最近记录: |