ディレクトリ内の特殊文字を検索して置換する

ディレクトリ内の特殊文字を検索して置換する

私は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

関連情報