awk、特殊文字を含む大きな文字列を削除する方法は?

awk、特殊文字を含む大きな文字列を削除する方法は?

特殊文字がたくさん含まれている大きな文字列を削除したいです。特殊文字を使用または引用することもsedできません。''""

だから私は努力しましたawk

gawk '{gsub("[VERYLGONGSTIRNGKKXquQX4wbbEKW8gUilRyw/withalotofspecialchars/ABUJBJHHF848488484.....end]", "");print}' file.txt

問題は文字列を削除しますが-

私の目標は、ファイルの残りの部分を維持することです。

file.txt
string1
string2
VERYLGONGSTIRNGKKXquQX4wbbEKW8gUilRyw/withalotofspecialchars/ABUJBJHHF848488484.....end
OTHERLONGSTRINGWHICHIWANTTOPRESERVE...
string4 

になる..

string1
string2
OTHERLONGSTRINGWHICHIWANTTOPRESERVE...
string4 

どうすればいいですか?

ベストアンサー1

シェルここに文書を引用参照処理/地獄脱出のための便利なメカニズムです。

string_with_quotes=$(cat << 'END'
long string with 'single quotes' and "double quotes" and *[arbitrary $special !characters.
END
)

awk の-vオプションはシェル変数を awk 変数として渡します。正規表現マッチングの代わりに文字列同等性を使用します。

awk -v target="$string_with_quotes" '$0 != target' file

Edが述べたように、[他の技術]-vに問題がある可能性があります。

special='foo\tbar\rqux'
awk -v target="$special" 'BEGIN {print target}'
qux   bar

環境を介して文字列を渡す

special='foo\tbar\rqux'
export special
awk 'BEGIN {print ENVIRON["string_with_quotes"]}'
foo\tbar\rqux

そして、あなたの質問について

export special=3
seq 5 | awk '$0 != ENVIRON["special"]'
1
2
4
5

[その他の技術]:問題は、awkがエスケープシーケンスを解釈したいかどうかであるためです(この2文字を\tawkで(i)2文字文字列または(ii)単一タブ文字として扱う必要があるか)。示されているように、環境強制 awk を使用してデータを渡します。いいえエスケープシーケンスを解釈します。 bashテクノロジを使用して同じことを行うこともできますが、これはエレガントではありません。

# not exported
special='foo\tbar\rqux'

awk -v target="${special//\\/\\\\}" 'BEGIN {print target}'
# or
awk -v target="$(printf '%q' "$special")" 'BEGIN {print target}'

おすすめ記事