SED - 行番号をテキストファイルの新しいテキストと変数に置き換えます。

SED - 行番号をテキストファイルの新しいテキストと変数に置き換えます。

Bashでの使用に問題がありますsed。誰でも助けることができますか?このsedコマンドはうまくいきます...

sed注文する

sed -i '3s/.*/...test_text.../g' FILE.txt

sedコマンド+変数

しかし、SEDの変数を新しいテキスト、新しい行として使用するとエラーが発生します... sed -e #expression #1、 `s'の未知のオプション

line_number="3"
new_text="...test_text..."
FILE="FILE.txt"
sed -i "${line_number}s/.*/${new_text}/" $FILE

説明をお手伝いできますか?問題とは何ですか?どのように書くべきですか?他の多くのバージョンを試してみましたが、他の赤いテーマもあります...それは止まりました。事前に助けてくれてありがとう。

ベストアンサー1

変数にスラッシュが含まれている場合は、コマンドnew_textsed挿入すると、内部式パーサーによって構文エラーが生成されますsed

s回避策は、コンマなどの他の文字をコマンド区切り文字として使用することです。

sed -i "$line_number s,.*,$new_text," "$file"

値がnew_text多すぎて文字列に表示されない区切り文字を確実に選択できない場合は、このcコマンドを使用することをお勧めします。c(変更)コマンドを使用して行を置き換えることができます。

sed -i "$line_number c \\$new_text" "$file"

このコマンドはca と改行文字の後に新しいテキストを取得します。 GNUでは、\改行文字はオプション\のようですsed。上記を使用してバックスラッシュで始める\ことができるようにし$new_text、二重引用符で囲まれた文字列にあるので、別のバックスラッシュでエスケープします。

移植可能なsedコマンドは次のとおりです。

sed "$line_number c \\
$new_text" "$file"

上記では、各改行文字$new_textの前に\文字が続き、データの一部であるリテラルバックスラッシュがエスケープされていると想定しています\\


awk以下では、GNUを使用してawk内部編集を有効にすることもできます。

text=$new_text awk -i inplace -v lineno="$line_number" \
    'NR == lineno { print ENVIRON["text"]; next }; 1' "$file"

GNUを除いて、新しいテキストがにあり、行番号がにあり、ファイルのパス名がにあると仮定しますawk$new_text$line_number$file

新しいテキストは環境変数を介してtextコードに渡されawk、行番号はコマンドラインの内部変数に渡されますawklineno与えられた行番号が見つかると、コードはtext現在の行を印刷するのではなく、環境変数の値を印刷します。

このようにawkGNUペア値を使用するには特別な制限はありません$new_text

はい(awk私のシステムではGNUと呼びますgawk):

$ cat file.txt
Line 1
Line 2
Line 3
$ new_text='hello world'
$ line_number=2
$ file=./file.txt
$ text=$new_text gawk -i inplace -v lineno="$line_number" \
    'NR == lineno { print ENVIRON["text"]; next }; 1' "$file"
$ cat file.txt
Line 1
hello world
Line 3

おすすめ記事