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)
感谢任何可以帮助我的人
要让该c
命令仅影响同时包含banana
和 的行wait
,请确保跳过与这两个模式不匹配的所有行。您可以使用以下b
命令来执行此操作,该命令将分支到当前行的编辑脚本的末尾:
sed -e '/banana/!b' -e '/wait/!b' -e "c\\$myvar" file
Run Code Online (Sandbox Code Playgroud)
c
如果当前行不匹配banana
或wait
(以任何顺序),则会跳过该命令。
如果顺序很重要(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
。