4

私はbashスクリプトをまとめており、その中でいくつかの必要な情報でファイルを更新する必要があります。私が使用しているコマンドは以下のとおりです。

sudo sed '
/end/ a\
First line to update\
  param 1 'var1'\
  param 2 'var2'\
  param 3 'var3'\
  param 4 'var4'\
end\
' TestFile >TestFileNew

これで、ファイルがデータで更新され、次のようになります。

end
First line to update
  param 1 'var1'
  param 2 'var2'
  param 3 'var3'
  param 4 'var4'
end

ファイルは作成され、データはその中にありますが、テキストから'記号が削除されているようで、これが発生したくないのですが、誰か助けてもらえますか?実際に生産されているものの例を以下に示します。

end
First line to update
  param 1 var1
  param 2 var2
  param 3 var3
  param 4 var4
end
4

4 に答える 4

6

""外側の引用符として使用します。

sudo sed "
/end/ a\\
First line to update\\
  param 1 'var1'\\
  param 2 'var2'\\
  param 3 'var3'\\
  param 4 'var4'\\
end\\
" TestFile >TestFileNew
于 2012-08-01T15:40:58.597 に答える
4

Igor は、一重引用符で機能する可能性のある回答を既に提供しているようです。

ファイルの作成に関しては、オプションとして実行しているsudoプログラム ( ) に影響することを覚えておいてください。sedシェルによって処理されるリダイレクトには影響しません。したがって、ユーザーとして書き込み権限TestFileNewがない場合、上記のように sudo を使用しても役に立ちません。

出力を別の場所に作成してから、sudo を使用してその場所に移動する方がよい場合があります。

sudo sed "/end/ ..." TestFile > /tmp/TestFileNew
sudo mv /tmp/TestFileNew ./TestFileNew

別の方法として、このスクリプト全体を sudo で実行することもできます... つまり/path/to/myscript、次のとおりです。

#!/bin/bash

sed "/end/ ..." TestFile > TestFileNew

それから:

$ sudo /path/to/myscript

次に、sudo はsed の代わりにbashを実行し、特権付きの bash インスタンスがスクリプト内のリダイレクトを処理します。

于 2012-08-01T15:55:35.917 に答える
1

rこの場合、おそらく sed のコマンドを使用する方が簡単でしょう:

$ cat > /tmp/repl << EOF
First line to update
  param 1 'var1'
  param 2 'var2'
  param 3 'var3'
  param 4 'var4'
end
EOF
$ sed '/end/r/tmp/repl' TestFile
$ rm /tmp/repl

(私は sudo/redirect の問題を無視しましたが、おそらくそうしたいでしょうsudo sh -c 'sed /end/r/tmp/repl/ TestFile > TestFileNew'

于 2012-08-01T16:23:50.077 に答える
1

場合によっては、2 種類の引用符 (html と javascript など) を処理する必要があります。次に、sed コマンドをスクリプトに入れると非常に便利です。

cat >FILE
end

cat >script.sed
/end/ a\
First line to update\
 param 1 'var1'\
 param 2 'var2'\
 param 3 'var3'\
 param 4 'var4'\
end            

sed -f script.sed FILE 
end
First line to update
  param 1 'var1'
  param 2 'var2'
  param 3 'var3'
  param 4 'var4'
end
于 2012-08-01T16:06:24.817 に答える