替换单引号之间的单词

替换单引号之间的单词

我试图替换 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'

相关内容