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。
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |