2016-03-31 22 views
0

sedコマンドをsedコマンドに置き換えようとしていますが、それが落ち続けるので、「ピケットフェンシング」の数時間後に私はここで質問します。RHEL6.7でsedをsedに置き換える

私はラインのこの種が含まれている様々なbashのスクリプトを持っている:

sed 's/a hard coded server name servername.//' 

私はそれを交換したいと思います:

sed "s/a hard coded server name $(hostname).//" 

注二重引用符の追加$は(ホスト名ように)が拡張されているので、これは私が予想していたよりやや厄介です。

だから、これは多くの私の最初だったが、失敗した試み:

cat file | sed 's!sed \'s\/a hard coded server name servername.\/\/\'!sed \"s\/a hard coded server name $(hostname).\/\/\"!g' 

私はまた、問題領域を試してみて、対象とする部品に置き換える打破するためのsedの素敵な「-e」オプションを使用してみました。私は解決策に「-e」スイッチを使用していないだろうが、それはデバッグに便利である場合があります:

cat file | sed -e 's!servername!\$\(hostname\)!' -e 's!\| sed \'s!\| sed \"s!' 

予想通り最初のsedの作品(空想何もここで起こっていない)、2番目は追加ので、何のポイントを失敗しません最後の二重引用符を置き換える必要があります。

この時点で私の歴史は混乱に陥り、失敗した試行をもう一度加えることはありません。

スクリプトはsedコマンドでいっぱいであり、スクリプト内の特定のコマンドを1つだけターゲットにしたいので、1つのコマンドで最初の置換を使いたいと思っていました。

すべてのアイデアをいただければ幸いです。

+2

あなたが外または使用 '「\」 ''すべての内側の単一引用符のために二重引用符を使用する必要があり、単一引用符内の単一引用符をエスケープすることはできません。それはhttp://stackoverflow.com/q/29613304/258523がここに何か助けているかどうかを確認しました。 –

+1

sedコマンド全体を二重引用符で囲んではいけません。また、将来の更新中に他のものが侵入するのを心配する必要があります。シェルが展開したい部分の一重引用符を打ち切ってください。 'sed '/ハードコードされたサーバ名' $(ホスト名) ''。// '' –

+0

コマンドで単一の引用符を正しくエスケープしたと思ったので、@Etanを展開できますか? – Chris

答えて

0

ここではあなたのような古いものと新しいテキストでmetacharsは、SEDとあなたが無視する(またはハンドル)場合は、awkの中でそれを行うことができる方法でしょうです:

$ awk -v old="sed 's/a hard coded server name servername.//'" \ 
     -v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//' \ 
      '{sub(old,new)}1' file 
sed 's/a hard coded server name '"$(hostname)"'.//' 

またはmetacharsに対処することを避けるために、のみを使用比較および交換のための文字列は:

$ awk -v old="sed 's/a hard coded server name servername.//'" \ 
     -v new="sed 's/a hard coded server name '\"\$(hostname)\"'.//'" \ 
      's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))}1' file 
sed 's/a hard coded server name '"$(hostname)"'.//' 
0

テンプレートツールの動作は、実際には使用しないシーケンスを使用して置き換えてください。例えば、彼らは以下の引用を必要とするので、単純にコロンを使用して:

#!/bin/bash 
sed "s/:servername:/$(hostname)/g" <<EOF > my_new_script.bash 
    echo "This is :servername:" 
EOF 

私は明確にする目的のために内部のスクリプトでechoを使用しました。外sedがプレーンテキストとして、ここで文書を処理しているため激論を引用回避

sed 's/complex substitution :servername:/inside quotes :servername:/' 

:あなたは均等のようなものを使用することもできます。

関連する問題