Sed命令仅在文件

时间:2015-12-03 10:06:15

标签: linux unix sed scripting

假设我只想将文件中的值替换一次。 我的命令是替换所有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"等

3 个答案:

答案 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