仅在具有特定字符串的行中替换另一个字符串

仅在具有特定字符串的行中替换另一个字符串

Shell 脚本查找单词“here”的出现位置,并仅在这些行中将单词“this”替换为单词“that”。其余所有行均按原样打印。

答案1

假设您file.txt包含以下两行:

here is this
but not this

您可以运行以下sed命令,在所有包含单词“here”的行中将“this”替换为“that”,而其他所有行保持不变:

sed '/\bhere\b/ s/\bthis\b/that/g' file.txt

请注意,\b模式中的 表示单词边界,即单词的开头或结尾。如果没有这些,例如“there”也会匹配。

输出:

here is that
but not this

阅读man sed更多信息。

答案2

一个awk(例如GNU Awk在 Ubuntu 中)解决方案可能如下所示:

awk '{ if ( /\yhere\y/ ) gsub ( /\ythis\y/ , "that" ); print }'

\y等于awk,其重要性在\b这里sed@ByteCommander 已经解释过了. 比较一下这个例子:

$ awk '{if(/here/)gsub(/\ythis\y/,"that");print}' <<EOL
> here is this
> here is athis
> there is this
> EOL
here is that
here is athis
there is that

$ awk '{if(/\yhere\y/)gsub(/\ythis\y/,"that");print}' <<EOL
> here is this
> here is athis
> there is this
> EOL
here is that
here is athis
there is this

解释

  • if ( conditional expression ) actionawkif语句:如果当前处理的行包含条件表达式, 然后做行动
  • /\yhere\y/– 匹配单词“here”的正则表达式
  • gsub(x,y)g全局(= 必要时每行多次)sub替代x经过y
  • print– 打印当前处理的行

相关内容