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