変数行から文字列を削除したいと思います。
remove_text=' hi'
;
文書:
kjdkjdkjddkjd
djdk hi sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk
hi
N行(この場合は2行)から削除したいと思います。
文書:
kjdkjdkjddkjd
djdk sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk
答え1
とても簡単ですsed
。
sed '2s/hi//' filename
ここで、2s
subs on line 2
(hi
最初のスラッシュペアのパターン)は置き換えられるパターンであり、2番目のスラッシュペアの間にパターンは削除されません。
このコマンドは変数にも機能しますが、次のように単一引用符ではなく二重引用符でコマンドを囲む必要があります。
remove_text=' hi'
sed "2s/${remove_text}//" filename
変数から行番号を選択したい場合でもこれを行うことができます。
ln=2
remove_text=' hi'
sed "${ln}s/${remove_text}//" filename
-i
with オプションを使用すると、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