私はUNIXでsedを使ってファイル内のテキストを特殊文字に置き換えています。グーグルで検索すると次のコマンドが見つかります
sed 's/from/to/g' file.txt
ここで「from」は置換される元のテキスト、「to」は置換後のテキストです。
私はこれを特殊文字を含む長いテキストのファイルに適用しようとしています。つまり、「/D/dec/prog/g++.exe -Wall --std=c++0x」(引用符なし)を「SYSTEM_PATH/BIN」に置き換えようとしています。次のことを試しましたが、うまくいきません。
sed 's//D/dec/prog/g++.exe -Wall --std=c++0x/SYSTEM_PATH/BIN/g' file.txt
しかし、エラー「sed: -e 式 #1、文字 10: `s' のオプションが不明です」が発生します。
私はUNIX初心者ですが、何らかの理由でファイルを処理するためにUNIXサーバーにリモートログインする必要があります。
1) 変数に from 文字列と to 文字列を定義するにはどうすればよいですか? たとえば、FROMSTR = '/D/dec/prog/g++.exe -Wall --std=c++0x' TOSTR = 'SYSTEM_PATH/BIN' のように指定します。
sed 's/$FROMSTR/$TO/g' file.txtのようにsedを呼び出すことができます。
しかし、sedはそれを変数として解釈する方法を知らないようです
2) テキストを sed で置き換えた後、結果が元のファイルに書き戻されません。どうすれば動作しますか?
答え1
代替コマンドは必要/
区切り文字として使用します。
sed 's!/D/dec/prog/g++.exe -Wall --std=c++0x!SYSTEM_PATH/BIN!g' file.txt
答え2
質問の指示に従ってください: まず、現在持っているものと、それを置き換えるものを設定します。
(base) localhost:~ # FROMSTR='/D/dec/prog/g++.exe -Wall --std=c++0x'
(base) localhost:~ # echo $FROMSTR
/D/dec/prog/g++.exe -Wall --std=c++0x
(base) localhost:~ # TOSTR='SYSTEM_PATH/BIN'
(base) localhost:~ # echo $TOSTR
SYSTEM_PATH/BIN
次に、sed を実行するためのファイルを作成しました。
(base) localhost:~ # cat > testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
次に、変数を呼び出す sed を実行しますが、最初の変数では echo を使用する必要があります。
(base) localhost:~ # sed -e "s|`echo $FROMSTR`|$TOSTR|" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2/D/dec/prog/g++.exe -Wall --std=c++0x2
3SYSTEM_PATH/BIN3
(base) localhost:~ # sed -e "s|$FROMSTR|$TOSTR|g" testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
これが機能するには、いくつかの条件があります。
- sed 区切り文字を、通常使用している / から、| または 2 つの変数のいずれでも使用していないものに置き換えます。
- 一重引用符 ' を使用すると、変数は内容ではなく名前として読み取られます。$TOSTR は SYSTEM_PATH/BIN ではなく $TOSTR になります。
- 変数を解釈できるように二重引用符を使用します。
sed で置換後のファイルを書き換える場合は、sed オプションに -i を追加する必要がありますが、> を使用して出力を新しいファイルにリダイレクトすることをお勧めします。
(base) localhost:~ # sed "s|$FROMSTR|$TOSTR|g" testSED > testSEDdone
(base) localhost:~ # cat testSEDdone
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3
(base) localhost:~ # cat testSED
1/D/dec/prog/g++.exe -Wall --std=c++0x1
2/D/dec/prog/g++.exe -Wall --std=c++0x2/D/dec/prog/g++.exe -Wall --std=c++0x2
3/D/dec/prog/g++.exe -Wall --std=c++0x3
(base) localhost:~ # sed -i "s|$FROMSTR|$TOSTR|g" testSED
(base) localhost:~ # cat testSED
1SYSTEM_PATH/BIN1
2SYSTEM_PATH/BIN2SYSTEM_PATH/BIN2
3SYSTEM_PATH/BIN3