ファイルのn行目のテキストを削除してください。

ファイルのn行目のテキストを削除してください。

変数行から文字列を削除したいと思います。 remove_text=' hi';

文書:

kjdkjdkjddkjd
djdk hi sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk

hiN(この場合は2行から削除したいと思います。

文書:

kjdkjdkjddkjd
djdk sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk

答え1

とても簡単ですsed

sed '2s/hi//' filename

ここで、2ssubs on line 2hi最初のスラッシュペアのパターン)は置き換えられるパターンであり、2番目のスラッシュペアの間にパターンは削除されません。

このコマンドは変数にも機能しますが、次のように単一引用符ではなく二重引用符でコマンドを囲む必要があります。

remove_text=' hi'
sed "2s/${remove_text}//" filename

変数から行番号を選択したい場合でもこれを行うことができます。

ln=2
remove_text=' hi'
sed "${ln}s/${remove_text}//" filename

-iwith オプションを使用すると、sedファイルは所定の位置で置き換えまたは更新されます。

答え2

何でも使うアッ:

remove_text=' hi';

awk -v rmtxt="$remove_text" '
NR==2{ len=length(rmtxt); ind=index($0, rmtxt);
       print substr($0, 1, ind-1) substr($0, ind+len)
}1' infile

または、match()関数を使用してください(match()は2番目の引数を正規表現として扱います)。

awk -v rmpat="$remove_text" '
NR==2{ match($0, rmpat);
       print substr($0, 1, RSTART-1) substr($0, RSTART+RLENGTH)
}1' infile

特に、これは「の最初の発生を見つけることです。テキストを削除「入力の2行目に2つの部分文字列(前部と末尾)を印刷します。


「すべてを削除したい場合テキストを削除」、次のように進みます。

awk -v rmtxt="$remove_text" 'BEGIN { FS=rmtxt; OFS="" } NR==2{ $1=$1 }1' infile

これが正義だ」テキストを削除awkのフィールド区切り文字として、入力の2行目にFS / OFSの入力行を再評価し、使用された1最終変更を印刷します。

またはgsub()関数を使用してください。ただし、gsub()を使用するとテキストを削除「価値正規表現リテラル文字列の文字列一致に基づく上記の解決策の代わりに:

awk -v rmpat="$remove_text" 'NR==2{ gsub(rmpat, "") }1' infile

関連情報