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/;}
非常感谢大家的帮助!