我试图替换 bash 中 fil 中单引号之间的单词,我尝试使用 sed 但它不起作用。
文件内容
Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to" -t 'value'
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to" -t 'value'
预期产出
Haarlem -m "verified" -n "verified" aalsmeer > "goes to" -t 'value'
Roterdam -m "verified" -n "verified" amsterdam > "goes to" -t 'value'
我的下面的 sed 命令不起作用
sed 's/-m '*.*' -n '*.*'/-m "verified" -n "verified"/'
答案1
您可以在此处使用双引号:
$ sed "s/'[^']*'/\"verified\"/g" ip.txt
Haarlem -m "verified" -n "verified" aalsmeer > "goes to"
Roterdam -m "verified" -n "verified" amsterdam > "goes to"
'[^']*'
匹配'
后跟非'
字符和再次'
字符- 您不能使用,
'.*'
因为它将从输入行的第一个'
到最后一个匹配'
- 您不能使用,
\"verified\"
用作"verified"
替换字符串,双引号被转义,因为它在双引号内使用
也可以看看:https://mywiki.wooledge.org/Quotes和为什么我的正则表达式在 X 中有效但在 Y 中无效?(正则表达式和通配符之间的区别)
上述解决方案后问题已更新。
$ cat ip.txt
Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to" -t 'value'
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to" -t 'value'
$ sed -E "s/(-[mn] )'[^']*'/\1\"verified\"/g" ip.txt
Haarlem -m "verified" -n "verified" aalsmeer > "goes to" -t 'value'
Roterdam -m "verified" -n "verified" amsterdam > "goes to" -t 'value'
-[mn]
将匹配-m
或-n
(-[mn] )
是一个捕获组,匹配的内容在替换部分中重用为\1
您还可以使用
sed -E "s/(-[^t] )'[^']*'/\1\"verified\"/g" ip.txt
仅防止-t '..'
被替换并匹配前面带有-<char>
空格的所有其他单引号模式
答案2
我对 Sundeep 的回答表示赞赏,但根据您对数据的信任程度,您可以做得更简单。
您只想查看前两次出现的情况,因此只需调用同一命令两次即可。假设引号之间有整个单词/数字,我选择非空白字符。这-E
只是为了能够扩展正则表达式。
测试文件
Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to"
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to"
$ sed -E \
-e "s/'\S+'/\"verified\"/" \
-e "s/'\S+'/\"verifired\"/" test_file
#
# Haarlem -m "verified" -n "verifired" aalsmeer > "goes to" -t 'value'
# Roterdam -m "verified" -n "verifired" amsterdam > "goes to" -t 'value'