3

给定以下文件

$ 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'
4

5 回答 5

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
于 2013-03-02T12:04:55.170 回答
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作业由行本身的匹配来表示。
于 2013-03-02T14:20:46.790 回答
1
awk 'BEGIN {RS=";"} /BAR/' a.txt
于 2013-03-02T12:00:36.207 回答
0
$ sed 's/;/\n/g;/^BAR/!D;P;d' a.txt
BAR='eee'
  • 全部替换;\n
  • 删除直到BAR行在顶部
  • 打印BAR线
  • 删除模式空间
于 2013-03-02T17:31:33.823 回答
0

以下 grep 解决方案可能对您有用:

grep -o 'BAR=[^;]*' a.txt
于 2013-03-02T17:41:26.727 回答