Bash shell脚本-编辑卷影文件中的行(';:';分隔符)

Bash shell脚本-编辑卷影文件中的行(';:';分隔符),bash,shell,sed,grep,Bash,Shell,Sed,Grep,在以下阴影类型文件中: user1:*:11111:0:88888:7::: user2:*:11111:0:88888:7::: user3:!!:11111:0:88888:7::: user4:!!:11111:0:88888:7::: user5:!!:11111:0:88888:7::: user6:!!:11111:0:88888:7::: 例如,我需要找到用户4并替换“!!”用“别的什么”。有人知道我怎么做吗 编辑:对不起,我不清楚-“!!”可以是任何东西。您的命令就在附近。最好

在以下阴影类型文件中:

user1:*:11111:0:88888:7:::
user2:*:11111:0:88888:7:::
user3:!!:11111:0:88888:7:::
user4:!!:11111:0:88888:7:::
user5:!!:11111:0:88888:7:::
user6:!!:11111:0:88888:7:::
例如,我需要找到用户4并替换“!!”用“别的什么”。有人知道我怎么做吗

编辑:对不起,我不清楚-“!!”可以是任何东西。

您的命令就在附近。最好仅在搜索的行中使用替换命令,而不是尝试匹配文字,在未找到字符时使用
[^…]
进行匹配,在本例中为冒号。尝试:

sed '/^user4:/ s/:[^:]*/:something_else/' infile
它产生:

user1:*:11111:0:88888:7:::
user2:*:11111:0:88888:7:::
user3:!!:11111:0:88888:7:::
user4:something_else:11111:0:88888:7:::
user5:!!:11111:0:88888:7:::
user6:!!:11111:0:88888:7:::
你的命令就在附近。最好仅在搜索的行中使用替换命令,而不是尝试匹配文字,在未找到字符时使用
[^…]
进行匹配,在本例中为冒号。尝试:

sed '/^user4:/ s/:[^:]*/:something_else/' infile
它产生:

user1:*:11111:0:88888:7:::
user2:*:11111:0:88888:7:::
user3:!!:11111:0:88888:7:::
user4:something_else:11111:0:88888:7:::
user5:!!:11111:0:88888:7:::
user6:!!:11111:0:88888:7:::
试试这个:

 sed '/^user4:/s/!!/something else/' file
试试这个:

 sed '/^user4:/s/!!/something else/' file

我不知道该怎么办。。。我可以在读取行时使用
遍历文件中的每一行;doneI会非常不喜欢用shell脚本编辑关键的系统文件——我已经看到太多的脚本会坏掉,导致系统无法使用。使用适当的工具(例如,
passwd
等)进行这些更改-编写这些更改时更可能考虑到磁盘已满情况、并发更改、文件的正确语法、与其他资源的依赖关系等…我不确定该怎么办。。。我可以在读取行时使用
遍历文件中的每一行;doneI会非常不喜欢用shell脚本编辑关键的系统文件——我已经看到太多的脚本会坏掉,导致系统无法使用。使用适当的工具(例如,
passwd
等)进行这些更改—编写这些更改时,很可能考虑了磁盘已满情况、并发更改、文件的正确语法、与其他资源的依赖关系等。。。