変数でsedコマンドを使用する

変数でsedコマンドを使用する

Stack Overflowと関連サイトで利用可能なすべてのソリューションを試しましたが、何も見つかりませんでした。私はこの問題についてかなりの時間を費やし、ついにこの質問を投稿しました。

sedシェル変数でコマンドを使用したいです。私のスクリプトはとても簡単です。

## string to replace is the text after comma in the variable pc.
to_replace=${pc#*,}
echo $to_replace

##text to be replaced by the following line
replace_with="PARTITIONED BY ($pc1);"
echo $replace_with

## use sed command to replace.
sed "s@$to_replace@$replace_with@" $entry  ## $entry is the variable that contains the file name

echoどちらのコマンドも、それぞれ次の出力を提供します。

PARTITIONEDED BY (date_key );  ## the text I want to be replaced
PARTITIONED BY ( date_key int );  ## the text I want to replace with

エラーが発生します。

sed: -e expression #1, char 2: unterminated `s' command

または、テキストはまったく置き換えられません。

誰かを助けてください。私はCentos 6を使用しています(利用可能な場合)。よろしくお願いします!

ベストアンサー1

sed: -e expression #1, char 2: unterminated `s' command

エラーメッセージは、2番目の文字でエラーが発生したことを示していますが、奇妙に見えます。最初の変数の先頭に改行文字を追加してそれを再現できます。

$ a=$'\nfoo'
$ b='bar'
$ sed "s@$a@$b@"
sed: -e expression #1, char 2: unterminated `s' command

エスケープされていない改行文字は sed コマンドを終了します。もちろん、後で改行文字を入れると、a次の文字にエラーが発生します。

スクリプトの前半で両方の変数を印刷しますが、引用符で囲まないため、前のスペースは削除され、それらの間のスペースは単一のスペースとして表示されます。

次のように、変数に実際に何が含まれているかを確認してください。

printf ">%s<\n" "$to_replace"
printf "%q\n" "$to_replace"

後者は、Bashが入力として受け入れられるように引用された文字列を表示するBash機能です。set -xsedコマンドラインの内容も表示されますが、出力のリテラル改行に注意する必要があります。

したがって、前に改行文字が1つしかない場合は、スクリプトの先頭から削除できます。

to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}

(これらを1つにまとめることができますが、改行文字がなくても別の手順が機能します。)

おすすめ記事