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选项将 shell 变量传递给 awk 变量。使用字符串相等而不是正则表达式匹配。

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

正如埃德评论的那样,[其他技术]-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 个字符\t在 awk 中应该被视为 (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}'

相关内容