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 -x
sedコマンドラインの内容も表示されますが、出力のリテラル改行に注意する必要があります。
したがって、前に改行文字が1つしかない場合は、スクリプトの先頭から削除できます。
to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}
(これらを1つにまとめることができますが、改行文字がなくても別の手順が機能します。)
答え2
この試み
sed -i -e "s@$to_replace@$replace_with@g" "$entry"
どこ
-i
-i
置換が使用されていない場合は、標準出力にある「所定の」置換を意味します。