特殊文字がたくさん含まれている大きな文字列を削除したいです。特殊文字を使用または引用することも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}'