我想删除一个带有很多特殊字符的大字符串。我什至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}'