查找并替换目录中的特殊字符

查找并替换目录中的特殊字符

我有许多基于 Windows 的.m3u播放列表 - 它们以 开头..\..\,并\以 而不是/文件夹路径开头,而 Ubuntu 更喜欢以 开头/media/usr/part/dir/(即绝对路径)。

我想做以下更改

  1. 全部替换..\..\/media/usr/part/dir/
  2. 全部替换\/

我尝试find /home/user/directory -name \*.m3u -exec sed -i "s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g" {} \;按照建议使用这里,并尝试使用_:作为建议的分隔符这里

然而,我不断得到

sed: -e expression #1, char 36: unterminated `s' command

我如何对我的文件进行必要的替换?

答案1

s/\.\.\\\.\.\/\/media\/usr\/part\/dir\//g

此命令是错误的,因为在第一个 之前sed缺少一个,这导致前面的将其作为文字转义(改变模式并“吃掉”分隔符),并且为了在每一行上替换单个 ,它在末尾有一个多余的开关;无论如何,它都缺少用字符部分替换字符的功能。\/\/..\..\g\/

请使用这个;我擅自更改了分隔符,以避免可能突然倾斜牙签综合征并将其更改;+提高该命令在处理大量文件时的性能:

find /home/user/directory -name \*.m3u -exec sed -i 's|\.\.\\\.\.\\|/media/usr/part/dir/|; s|\\|/|g' {} \+

输出:

~/tmp$ cat playlist1.m3u 
..\..\path1
stuff
..\..\path2\path2
stuff
..\..\path3\path3\path3
stuff
~/tmp$ find . -name \*.m3u -exec sed -i 's|\.\.\\\.\.\\|/media/usr/part/dir/|; s|\\|/|g' {} \+
~/tmp$ cat playlist1.m3u 
/media/usr/part/dir/path1
stuff
/media/usr/part/dir/path2/path2
stuff
/media/usr/part/dir/path3/path3/path3
stuff

相关内容