![查找并替换目录中的特殊字符](https://linux22.com/image/1127786/%E6%9F%A5%E6%89%BE%E5%B9%B6%E6%9B%BF%E6%8D%A2%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6.png)
我有许多基于 Windows 的.m3u播放列表 - 它们以 开头..\..\
,并\
以 而不是/
文件夹路径开头,而 Ubuntu 更喜欢以 开头/media/usr/part/dir/
(即绝对路径)。
我想做以下更改
- 全部替换
..\..\
为/media/usr/part/dir/
- 全部替换
\
为/
我尝试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