sedを使用してファイル内の単語を制御文字に置き換える方法

sedを使用してファイル内の単語を制御文字に置き換える方法

ファイル内の対応する単語を制御文字にグローバルに置き換える方法。どうすればいいですか?私は成功せずに次のことを試しました。

Replace "^Aabc_def_a^B" with "^Adef_a^B" globally

以下を試しました。

sed -i 's/^Aabc_def_a^B/^Adef_a^B/g' file.txt 

sed -i 's/\^Aabc_def_a\^B/\^Adef_a\^B/g'file.txt

sed 's/x01abc_def_ax02/x01def_ax02/g'

答え1

私のために働くようです:

$ echo -n "^Aword^B" | sed 's/^Aword^B/^Alexical unit^B/' | hexdump -C
00000000  01 6c 65 78 69 63 61 6c  20 75 6e 69 74 02 0a     |.lexical unit..|
0000000f

01代表する^A;02^B

キャレット(^)の後に、Aまたはではなくリテラル制御文字を使用していることに注意してくださいBsed作成されたとおりにコマンドを入力するには、次にCtrl制御V文字を使用して入力として解析するのではなく、文字通り挿入しますreadline

つまり、を挿入するには、-を^A押してから-を押すと入力内容が表示されます。このオプションの上に矢印を置くと、画面に2文字で構成されていても、カーソルは常にこのオプションを単一の単位として扱うことがわかります。CtrlVCtrlA^A

答え2

GNU sedでは、次のように動作します。\xHH

$ printf '\001foo\002\n' | sed 's/\x01foo\x02/\x01bar\x02/g' | od -c
0000000 001   b   a   r 002  \n

GNU sedはありませんが、Bashがある場合は、$''引用符を使用してシェルから制御文字を生成できます。

$ printf '\001foo\002\n' | sed $'s/\x01foo\x02/\x01bar\x02/g' | od -c
0000000  001   b   a   r 002  \n        

両方がない場合、Perlは常に次のことを理解しています。\xHH

$ printf '\001foo\002\n' | perl -pe 's/\x01foo\x02/\x01bar\x02/g' | od -c
0000000  001   b   a   r 002  \n

もちろん、同じことができます-i

関連情報