Bashスクリプトでsed
アポストロフィを含むコマンドを使用する方法はありますか?それともそうでないようにコマンド'
を変更する必要がありますか?sed
'
たとえば、次のbashスクリプトを実行したいとします。
#!/bin/bash
cat file.txt | sed $'s|^\(some-string\)|\f\\1|'
このsed
コマンドは、some-string
insideが表示されるたびに改行文字を追加する必要があります。スクリプトがcatコマンドのみを実行しているように見えるため、これは機能しません。
"
また、コマンドの周りに引用符を追加してみましたsed
。
cat file.txt | sed "$'s|^\(some-string\)|\f\\1|'"
エラーを返します。
sed: -e expression #1, char 2: unknown command: `''`
sh script.sh
.
答え1
$'...'
C文字列の場合、\f
これはフォームフィード文字(FF、^ L)です。改行文字は\n
改行文字(LF、^ J)です。標準では、sed
コマンドの代替部分にs
LF\
が続く文字を挿入する必要があります。
だからあなたは以下が欲しい:
#! /bin/sh -
< file.txt sed '
s|^some-string|\
&|'
そして$'...'
:
#! /bin/bash -
< file.txt sed $'s|^some-string|\\\n&|'
GNU実装では、改行/ LFを表すために置換を使用することもsed
できます。\n
#! /bin/sh -
< file.txt gnu-sed 's|^some-string|\n&|'
いずれにせよ、sed
このコマンドにはアポストロフィは渡されません。'...'
と$'...'
シェルの引用演算子です。最初(標準)は内部コンテンツをそのままに配信するために使用されsed
、2番目(ksh93拡張は現在を含むいくつかの他のシェルでサポートされているbash
)に配信する前にその中のシーケンスを拡張するために使用されます\f
。はい、。\n
sed
たとえば、sを置き換えるコマンドなど、リテラル'
をに渡したい場合は、渡すことを許可するシェル引用演算子を使用できます。これにはすべての引用演算子が含まれます。sed
y/'/"/
'
"
'
とは別に '...'
それ自体:
sed $'y/\'/"/' # $'...' quoting operator
sed "y/'/\"/" # "..." quoting operator
sed y/\'/\"/ # \x quoting operator
答え2
Posixly sedがこれを達成する方法は次のとおりです。
$ sed -e '/^some_string/!b' - e 'H;s/.*//;x' filename