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_text
にsed
挿入すると、内部式パーサーによって構文エラーが生成されますsed
。
s
回避策は、コンマなどの他の文字をコマンド区切り文字として使用することです。
sed -i "$line_number s,.*,$new_text," "$file"
値がnew_text
多すぎて文字列に表示されない区切り文字を確実に選択できない場合は、このc
コマンドを使用することをお勧めします。c
(変更)コマンドを使用して行を置き換えることができます。
sed -i "$line_number c \\$new_text" "$file"
このコマンドはc
a と改行文字の後に新しいテキストを取得します。 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
、行番号はコマンドラインの内部変数に渡されますawk
。lineno
与えられた行番号が見つかると、コードはtext
現在の行を印刷するのではなく、環境変数の値を印刷します。
このようにawk
GNUペア値を使用するには特別な制限はありません$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
答え2
上記のように変数と命令を入力してもエラーは発生しません。問題は実際の内容にあるnew_text
。私の考えでは、これと同じスラッシュが含まれていると思いますnew_text=usr/bin
。その後、変数を置き換えると、次の結果が表示されます。
sed -i "3s/.*/usr/bin/" FILE.txt
したがって、その行はに置き換えられ、引き続きコマンドのフラグを解釈し、usr
正当sed
なオプションではないことを探しますs
。b
bin
有効な文字範囲がわかっている場合は、new_text
範囲外の文字を区切り文字として選択してください。
sed -i "${line_number}s~.*~${new_text}~" $FILE