使用终端中的grep if命令的麻烦

时间:2014-10-27 18:55:58

标签: regex bash terminal grep

我该怎么办?

"input" | \

if
grep -E 'phone_and_fax":"Phone: .*  Fax:'
then
sed 's/phone_and_fax":"Phone:/|/g' | \
sed 's/  Fax:/|/g' | \
sed 's/original_license_date":"Original License Date:/|/g'
elif
grep 'phone_and_fax":"Phone: '
then
sed 's/phone_and_fax":"Phone:/|/g' | \
sed 's/original_license_date":"Original License Date:/||/g'
elif
grep '  Fax:'
then
sed 's/phone_and_fax":"Phone:/||/g' | \
sed 's/  Fax:/|/g' | \
sed 's/original_license_date":"Original License Date:/|/g'
else
sed 's/phone_and_fax":"Phone:/||/g' | \
sed 's/original_license_date":"Original License Date:/|/g'
fi | \

"continue script"

正在被替换的内容或正在寻找的内容并不重要。我想要做的是使用一些管道来处理一些文本,但if它使用grep使用正则表达式运行某个模式,then它需要更改它将替换的内容那个特定的例子。但是grep不应该改变管道的输出。

1 个答案:

答案 0 :(得分:1)

sed已经有grep - 就像其语法内置的测试一样:

例如,请使用此伪代码:

if grep -E 'some.*xt'; then sed 's/some/SOME/g'; fi

它可以转换为sed的单个调用。观察:

$ echo some text | sed '/some.*xt/ s/some/SOME/g'
SOME text

对战:

$ echo some test | sed '/some.*xt/ s/some/SOME/g'
some test

更长的例子

考虑这个伪代码:

if
grep -E 'some.*xt'
then
sed 's/some/SOME/g'
elif
grep 'is'
then
sed 's/is/IS/g'
fi | \
sed 's/This/""/g'

等效的sed语句是:

sed '/some.*xt/ {s/some/SOME/g; b fi}; /is/ s/is/IS/g; :fi; s/This/""/g'

伪代码的elif部分在这里被翻译成分支语句。如果条件/some.*xt/匹配,则执行替换s/some/SOME/gb fi告诉sed跳转到标签fi。这与elif语句的逻辑等效。

示例说明了这一点:

$ echo "some text This is" | sed '/some.*xt/ {s/some/SOME/g; b fi}; /is/ s/is/IS/g; :fi; s/This/""/g'
SOME text "" is
$ echo "some test This is" | sed '/some.*xt/ {s/some/SOME/g; b fi}; /is/ s/is/IS/g; :fi; s/This/""/g'
some test ThIS IS