Regex 在终端中使用grep的if命令出现问题
我怎么做这样的事Regex 在终端中使用grep的if命令出现问题,regex,bash,terminal,grep,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
"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"
更换什么或寻找什么并不重要。我试图做的是使用一些管道来处理一些文本,但是如果
它使用grep
和regex在某个模式上运行,那么它需要更改它将替换为该特定实例的内容。但是grep
不应改变管道的输出。sed
已经在其语法中内置了grep
类测试:
例如,以以下伪代码为例:
if grep -E 'some.*xt'; then sed 's/some/SOME/g'; fi
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
的单个调用。注意:
$ 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'; fi
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
提供一个确切的示例来说明您正在尝试做什么会更有帮助,因为您的问题中的示例似乎有点做作。grep和sed都包含输入,您不能让它们都在这样的管道的单个段中运行。grep
可能根本不需要。如果s/is/is/g
与字符串is
不匹配,则输入会原封不动地传递,因此您无需先检查is
是否存在。@TomFenech我修复了它这太棒了!我忘了在我的问题中添加一个部分(对此我深表歉意),但是如果在if
命令中,我希望发生多个替换,但只有当匹配模式的值为true时,这是否仍然有效?或者如何在管道命令中使用该命令?@double_j您可以在条件之后放入任意多个替换(substitute)命令,方法是将它们放在大括号中,用分号分隔:sed'/some.*xt/{s/some/some/g;s/text/text/;}
非常感谢大家的帮助!