给定以下文件
$ cat a.txt
FOO='hhh';BAR='eee';BAZ='ooo'
tr我可以很容易地用和解析出一个项目grep
$ tr ';' '\n' < a.txt | grep BAR
BAR='eee'
但是,如果我尝试使用sed它只会打印所有内容
$ sed 's/;/\n/g; /BAR/!d' a.txt
FOO='hhh'
BAR='eee'
BAZ='ooo'
使用 awk 你可以这样做:
awk '/BAR/' RS=\; file
但是如果在这种情况下BAZ会产生一个额外的换行符,因为;最后一个单词后面没有。如果您还想删除该换行符,则需要执行以下操作:
awk '/BAZ/{sub(/\n/,x); print}' RS=\; file
或者使用 GNU awk 或 mawk 你可以使用:
awk '/BAZ/' RS='[;\n]'
如果你的 grep 有 -o 选项,那么你也可以试试这个:
grep -o '[^;]*BAZ[^;]*' file
sed可以随心所欲:
sed -n 's/.*\(BAR[^;]*\).*/\1/gp' <<< "FOO='hhh';BAR='eee';BAZ='ooo'"
这里的重点是您必须禁止sed的默认输出——整行——,并且只打印您想要执行的替换。
值得注意的点:
sed -n抑制默认输出;s/.../.../g在整条线上运行,即使已经匹配——贪婪;s/.1./.2./p打印出替换部分 ( .2.);tr部分作为表达式中的分隔符给出\(BAR[^;]*\);grep作业由行本身的匹配来表示。awk 'BEGIN {RS=";"} /BAR/' a.txt
$ sed 's/;/\n/g;/^BAR/!D;P;d' a.txt
BAR='eee'
;为\nBAR行在顶部BAR线以下 grep 解决方案可能对您有用:
grep -o 'BAR=[^;]*' a.txt