假设我只想将文件中的值替换一次。 我的命令是替换所有matchin模式。 示例
read -p "Enter the reference account name : " ACC
read -p "Enter the user name to be inserted into VISUDO : " UNAME
sed -i "s/\( *$ACC =*\)[^ ]*\(.*\)*$/\1 $UNAME,\2/" sudo_file.txt
档案
User_Alias USERS1 = user1
Runas_Alias APP = oozie
Cmnd_Alias SU_APP = /bin/su - oozie
USERS1 ALL = (root) SU_APP
USERS1 ALL = (APP) ALL
当m运行它替换上述文件中的所有值USER1时。 我希望输出为
User_Alias USERS1 = user1, user2, user3
仅适用于此行,而不适用于文件中出现的其他两个USER1
。
ACC为USER1且UNAME为" user1"或" user2"或" user3"等
答案 0 :(得分:1)
您可以在sed
中使用分支:
for i in {1..20} ; do
echo $i
done | sed 's/2/TWO/; te; b; :e {n;be}'
2被TWO取代,然后t
分支到e
,其中n
读取以下行并再次转到e
。在匹配之前,te
不执行任何操作,因此b
会跳到脚本末尾并处理下一行。
答案 1 :(得分:0)
您只需保留一个计数器即可执行一次替换:
awk '/pattern/ && !c {sub("find", "replace") && c=1}1' file
也就是说,寻找模式并执行替换以防万一之前没有发生过。在这种情况下,尝试执行它并设置计数器(如果已完成)。
$ cat file
hello man
hello there
hello you
hello there
$ awk '/hello/ && !c {sub("here", "XXX") && c=1}1' file
hello man
hello tXXX
hello you
hello there
答案 2 :(得分:0)
这已在here
之前得到解答您的sed命令可能如下所示(我已经验证以下命令正在处理您提供的sudo_file内容):
sed "0,/User_Alias/{s/\( *$ACC =*\)[^ ]*\(.*\)*$/\1 $UNAME,\2/}" sudo_file.txt