bashファイルを作成し、sedを使用して他のファイルを編集しています。次の行の後に新しい行を追加したいと思います。
echo "rpcallowip=127.0.0.1\n";
追加された行は次のように表示されます。
echo "rpcallowip=$webip\n";
新しい出力はexample.conf
次のとおりです。
echo "rpcallowip=127.0.0.1\n";
echo "rpcallowip=10.0.0.1\n";
図に示すように、行が ""に保たれることが重要です。
答え1
file
コンテンツを含むファイルがあるとしましょう。
text
text text
echo "rpcallowip=127.0.0.1\n";
text
text text
echo
行の後に行を追加するには、次のコマンドを使用しますsed
。
sed '/^echo "rpcallowip=127.0.0.1\\n";$/a\
echo "rpcallowip=$webip\\n";
' file
GNUの使用sed
:
sed '/^echo "rpcallowip=127.0.0.1\\n";$/a echo "rpcallowip=$webip\\n";' file
どちらの例も、最初にテキストを追加するテキスト行を最初から最後まで一致させ、次にコマンドsed
(「append」)を使用してa
必要なテキストを追加します。パターンと挿入されたテキストの両方でinをもう一度エスケープする必要があり\
ます\n
(そしてもう少し賢明に言えば、パターンのIPアドレスのすべての点は必要です\.
)。
上記の作業の結果は次のとおりです。
text
text text
echo "rpcallowip=127.0.0.1\n";
echo "rpcallowip=$webip\n";
text
text text
答え2
名前付きファイルの既存の行の後にsed
行を追加する強力で簡単な方法は次のとおりです。echo "rpcallowip=$webip\n";
echo "rpcallowip=127.0.0.1\n";
example.conf
sed 's/echo "rpcallowip=127.0.0.1\\n";/echo "rpcallowip=127.0.0.1\\n";\necho "rpcallowip=$webip\\n";/' example.conf
実際に改行文字として扱われないようにするには、4つの改行文字のうち3つを\n
バックスラッシュでエスケープする必要があります。\
これがあなたが達成したいものですか?
より慣用的な解決策は、次のものを使用することです。sed
グループ:
sed 's/\(echo "rpcallowip=127.0.0.1\\n";\)/\1\necho "rpcallowip=$webip\\n";/' example.conf
2番目の例では、次のように分割しますsed
。\(
\)
sed
グループ、\1
以前に分割された最初のグループ(この場合は唯一のグループ)を表します。
答え3
このsedを試してみることもできます。
webip='10.0.0.1'
sed -E '
h
s/(echo "rpcallowip=)([0-9.]*)(.*)/\1'"$webip"'\3/
tA
b
:A
x
p
x
' infile