Unix命令检查单词是否存在,然后替换单词else保持原样

时间:2019-01-28 00:22:17

标签: unix sed

我有一个包含多行的文件,我需要查找一个单词。如果存在,则替换为另一个词,否则将其保留。

输入

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'

谢谢`

3 个答案:

答案 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开关将在原位置更改输入文件。