sed命令替换txt文件中的文件路径

sed命令替换txt文件中的文件路径

大家好!

我正在尝试使用 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内容相关的行。

相关内容