我该怎么办?
"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
不应该改变管道的输出。
答案 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/g
,b 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