给出以下文件
$ 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'
答案 0 :(得分:2)
使用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
答案 1 :(得分:2)
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
作业由行本身的匹配表示。答案 2 :(得分:1)
awk 'BEGIN {RS=";"} /BAR/' a.txt
答案 3 :(得分:0)
$ sed 's/;/\n/g;/^BAR/!D;P;d' a.txt
BAR='eee'
;
替换为\n
BAR
行位于顶部BAR
行答案 4 :(得分:0)
以下grep解决方案可能适合您:
grep -o 'BAR=[^;]*' a.txt