我有一个包含多行的文件,我需要查找一个单词。如果存在,则替换为另一个词,否则将其保留。
输入
Amount:{12},members:{2,state:{'xx'},city:{'yyyy'}`enter code here`
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6,state:{'xx'},city:{'yyyy'}
如果该行包含单词members
,则,state:
应替换为},state:
;否则,如果该行中不存在单词members
,则不对该行进行任何更改
输出
Amount:{12},members:{2},state:{'xx'},city:{'yyyy'}
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6},state:{'xx'},city:{'yyyy'}`
我尝试了这个sed -i -e '/members/ s/,state/},state/; s/,state/,state'
谢谢`
答案 0 :(得分:3)
使用sed
,请尝试:
sed 's/\(members.*\)\(,state:\)/\1}\2/' input.txt
答案 1 :(得分:0)
需要两次通过,但是可以解决问题。
#!/bin/bash
check=$(<input.txt)
match=",state:"
repl="},state:"
recheck="${check//$match/$repl}"
match="}}"
repl="}"
final="${recheck//$match/$repl}"
echo "${final}" > input2.txt
您可以直接在命令行上键入它,或者制作一个.sh shell脚本并使用
在本地运行chmod +x fix_state.sh
./fix_state.sh
答案 2 :(得分:0)
您自己的尝试实际上可以奏效,只需稍做修改即可:
$ cat file
Amount:{12},members:{2,state:{'xx'},city:{'yyyy'}`enter code here`
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6,state:{'xx'},city:{'yyyy'}
$ sed -e '/members/ s/,state/},state/;' file
Amount:{12},members:{2},state:{'xx'},city:{'yyyy'}`enter code here`
Amount:{12},state:{'xx'},city:{'yyyy'}
Amount:{10},members:{6},state:{'xx'},city:{'yyyy'}
或使用perl
:
perl -pe 's/,state/}.state/ if /members/' file
当您确定结果是您想要的时,可以将-i
开关都添加到这两个开关中。
添加-i
开关将在原位置更改输入文件。