sed模仿“tr | grep”

时间:2013-03-02 09:56:07

标签: bash sed grep

给出以下文件

$ cat a.txt
FOO='hhh';BAR='eee';BAZ='ooo'

我可以使用trgrep

轻松解析出一个项目
$ tr ';' '\n' < a.txt | grep BAR
BAR='eee'

但是,如果我使用sed尝试此操作,则只打印所有内容

$ sed 's/;/\n/g; /BAR/!d' a.txt
FOO='hhh'
BAR='eee'
BAZ='ooo'

5 个答案:

答案 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