sed 基于 2 个单词,然后用变量替换整行

Cla*_*ete 2 linux scripting bash sed pattern-matching

我有一个txt文件,看起来像这样,

1:Ana:apple:08:00:wait
1:Joe:banana:08:30:wait
1:Oscar:orange:08:45:ready
1:Monica:apple:08:50:ready
1:Mark::orange:ready
Run Code Online (Sandbox Code Playgroud)

我必须找到只包含两个单词“banana”和“wait”的第一行,然后用$myvar替换整行

到目前为止我已经尝试过这段代码,但我认为我在同时匹配 2 个单词时遇到一些问题。

sed -i "0,/banana.wait/c\$myvar" myfile
Run Code Online (Sandbox Code Playgroud)

感谢任何可以帮助我的人

Kus*_*nda 7

要让该c命令仅影响同时包含banana和 的行wait,请确保跳过与这两个模式不匹配的所有行。您可以使用以下b命令来执行此操作,该命令将分支到当前行的编辑脚本的末尾:

sed -e '/banana/!b' -e '/wait/!b' -e "c\\$myvar" file
Run Code Online (Sandbox Code Playgroud)

c如果当前行不匹配bananawait(以任何顺序),则会跳过该命令。

如果顺序很重要(banana之前wait),则使用

sed -e '/banana.*wait/!b' -e "c\\$myvar" file
Run Code Online (Sandbox Code Playgroud)

如果匹配整个单词而不是子字符串(即 onlybanana和 not bananas)很重要,则将每个单词包装在\<...\>or中\b...\b以确保单词边界正确匹配。

请注意双反斜杠,这是在双引号字符串中插入单个反斜杠的方法。单个反斜杠会转义$in $myvar,从而防止变量被扩展。

请注意,这需要一个sed实现,例如 GNU ,它允许输入命令sed文本而不需要前面的换行符。c

这进一步假设值中的任何文字换行符都$myvar使用文字反斜杠字符进行转义,如

myvar='hello\
world'
Run Code Online (Sandbox Code Playgroud)

如果输入数据被构造为带有字段的记录,并且如果哪个字段是什么banana以及哪个字段很重要wait,则可以正确解析记录,可能使用awk,如

value=$myvar awk -F : '$3 == "banana" && $NF == "wait" { $0 = ENVIRON["value"] }; 1' file
Run Code Online (Sandbox Code Playgroud)

这显式测试了第三个字段banana(精确字符串测试而不是正则表达式子字符串测试),最后一个字段并用wait给定值替换当前记录,作为环境变量传入value