【问题标题】:Trouble with if command using grep in Terminal在终端中使用 grep 的 if 命令出现问题
【发布时间】:2014-12-23 01:24:12
【问题描述】:

我该如何做这样的事情?

"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 不应该改变管道的输出。

【问题讨论】:

  • 提供一个您正在尝试做的确切示例会更有帮助,因为您问题中的示例似乎有点做作。
  • grep 和 sed 都吞下输入,你不能让它们都像这样在管道的单个段中运行。
  • grep 可能根本不需要。如果s/is/IS/g 与字符串is 不匹配,则输入原样通过,因此您无需先检查is 是否存在。
  • @TomFenech 我修好了

标签: regex bash terminal grep


【解决方案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

【讨论】:

  • 这太棒了!我忘了在我的问题中添加一个部分(对此我深表歉意)但是如果在if 命令中我希望发生多个替换,但前提是匹配模式的值为真,这是否仍然有效?或者我如何在管道命令中运行它?
  • @double_j 您可以在条件之后放置任意数量的替换(替换)命令,方法是将它们放在花括号中,用分号分隔:sed '/some.*xt/ {s/some/SOME/g; s/text/TEXT/;}'
  • 完美,非常感谢您的帮助!
猜你喜欢
  • 2017-05-18
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2014-12-31
  • 2020-06-10
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多