我需要从文件中删除特定的、精确的字符串。这被用作我正在实施的清理过程的一部分。问题是,有些变体与我要删除的特别精确的字符串相似,但不完全相同。
例如,以下是文件“sample”的示例:
tmp2
tmp3
tmp0
tmp1
tmp3
tmp3
tmp3
tmp1.1
tmp3
tmp2
tmp3
tmp1.2
tmp4
我只想删除“tmp1”,而不是“tmp1.1”或“tmp1.2”。
我正在使用单行 Perl 命令:
perl -i -nle 'print if !/tmp1/' ./sample
显然,单行脚本并不流畅。当然,它会删除“tmp1”,但是,它也会删除“tmp1.1”和“tmp1.2”。
有任何想法吗?
使用锚点。
^
用于行首和$
行尾。在每个 Unix 机器上的任何 shell 中使用任何 awk,下面是一个全行字符串比较,它将删除与该字符串匹配的行:
或使用变量:
请参阅如何在 awk 脚本中使用 shell 变量?了解更多信息。
请注意,上面正在进行文字字符串比较,因此即使您的目标字符串包含正则表达式元字符,它也会工作,例如:
除了基于 shell 和 perl 的命令之外,您也可以尝试使用 python。
输出将为:['temp1.1', 'temp1.2', 'other_temp', 'another_temp1.1']
使用Raku(以前称为 Perl_6)
使用 Raku 的
m/…/
匹配运算符:或者,当您说“匹配并删除”时,建议使用
s///
或S///
替换运算符(什么都不替换):Raku 是 Perl 系列中的一种编程语言,提供对 Unicode 的内置高级支持。上面是两个答案,但像 Perl 本身一样,TMTOWTDI 适用,并且可以设想其他答案。
正如其他答案中提到的,这里的关键是使用零宽度锚点,例如:
^
字符串开头、$
字符串结尾、^^
行开头$$
、行结尾。更多正则表达式建议位于底部链接。输入示例:
示例输出:
https://docs.raku.org/language/regexes
https://docs.raku.org/language/regexes-best-practices
https://raku.org