给定以下文件
$ 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'
;
为\n
BAR
行在顶部BAR
线以下 grep 解决方案可能对您有用:
grep -o 'BAR=[^;]*' a.txt