大家好!
我正在尝试使用 sed cmd 更改文本文件中的目录路径。
我测试命令的服务器正在运行 Rocky Linux 8.5 (Green Obsidian)。
这是我正在使用的 sed 命令:
sed -i 's|1344P1052_ssl02 /gs:/prod1|sd://prod1-backup|g' example.txt
sed -i 's|1344P1052_ssl09 /gs:/prod1|sd://prod1-backup|g' example.txt
输出没有错误,但文件中的目录路径保持不变。
它应该改变[下面的例子]
前:
1344P1052_ssl02 /gs:/prod1/some_notes_here_1
1344P1052_ssl09 /gs:/prod1/some_notes_here_2
后:
sd://prod1-backup/some_notes_here_1
sd://prod1-backup/some_notes_here_2
我认为由于空格、分号等原因它不起作用,但我用谷歌搜索了该组的答案并使用|
应该适用于特殊字符、反斜杠和空格。现在我不太确定,所以我只是用 vim 逐行手动完成。
真的很感谢任何帮助...
答案1
我假设您的替换失败,因为输入文件中的两列是制表符分隔的,而不是空格分隔的。
您可以使用文本制表符(在命令行中使用 键入)来代替正则表达式中的空格Ctrl+V Tab,或者可以使用表示制表符的表达式,例如[[:blank:]]
(匹配单个制表符或空格字符) 或[[:space:]]
(匹配一组较大的类似空格的字符中的单个字符,包括水平和垂直制表符、回车符等)
sed -e 's|^1344P1052_ssl02[[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-e 's|^1344P1052_ssl09[[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-i example.txt
或者,甚至更短,
sed -e 's|^1344P1052_ssl0[29][[:blank:]]/gs:/prod1/|sd://prod1-backup/|' \
-i example.txt
- 我已将您的图案中的空格替换为
[[:blank:]]
.这允许在文本中的该位置使用单个空格或制表符。 - 我还将这两个替换合并到一个
sed
调用中,以避免两次读取整个文件。 - 我删除了
g
两个替换命令上的标志,因为我们不希望每行进行一次以上的替换。 - 我添加了一个
^
锚点以确保模式在每行的开头匹配。 - 我
/
在模式和替换字符串的末尾添加了 ,以免意外更改与prod10
编号更高的prod
内容相关的行。