sedを使用してファイルの特定の行の後に与えられた行を追加する方法

sedを使用してファイルの特定の行の後に与えられた行を追加する方法

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

関連情報