如何从文本文件中删除确切的文本?

How to remove exact text from a text file?

提问人:DDisciple 提问时间:4/17/2019 最后编辑:AnubisDDisciple 更新时间:4/17/2019 访问量:250

问:

我有一个日志.txt文件,看起来像这样。

2.txt
/home/test/2.txt

文件名后跟其原始路径,我想更新此日志以在删除该特定文件时删除这些行,这是执行此操作的代码段。

if grep -Fxq "$var" log.txt
then
      result=$(grep -m2 "$var" log.txt | tail -n1 )
      mv $var $result
      grep -w $var log.txt > log.txt.tmp
fi

前两行有效,它确实将文件移回 添加到其原始目录中。

这条线在这里

grep -w $var log.txt > log.txt.tmp

将我想从 log.txt 中删除的内容放入临时文本文件中。这是不正确的

我需要删除

grep -w $var log.txt > log.txt.tmp

从 log.txt 文件中,但我似乎无法做到这一点

我试图从两个文件中删除相同的内容,但这太慢了,我不想每次都排序。必须有一种更简单的方法。 谢谢。

基本上,输出将如下所示。

2.txt
/home/2.txt
3.txt
/home/3.txt

如果他们决定删除 2.txt(已经有效),新的 Log.txt 文件将是

3.txt
/home/3.txt

我认为它基本上需要搜索 log.txt 并删除文件名及其下方的行。

sed -i "/$var/d" log.txt

我试过这个,但它也删除了包含 1.txt 的文件,所以如果文件是 11.txt,它也会删除它。

巴什

评论

2赞 Cyrus 4/17/2019
请将该示例输入所需的输出添加到您的问题中。
0赞 daniu 4/17/2019
所以IIUCsed -i "/$var/d" log.txt
0赞 DDisciple 4/17/2019
@daniu,不幸的是,它会删除具有类似名称的文件,例如 11.txt因为其中有 1.txt :(
0赞 Anubis 4/17/2019
然后做.这将强制文件名以变量开头。或者,进行精确匹配。sed -i "/^$var/d" log.txtsed -i "/^$var$/d" log.txt
0赞 DDisciple 4/17/2019
@Anubis这也会删除文件名下的目录吗?因为它在路径中包含文件名?

答:

0赞 Anubis 4/17/2019 #1
if grep -Fxq "$var" log.txt
then
    result=$(grep -m2 "$var" log.txt | tail -n1 )
    echo mv $var $result
    sed -i '/'"${var//\./\\.}"'$/d' log.txt  # remove all the lines ending with $var value
fi

请注意,在一般情况下,任何句点符号 () 都需要转义,因为句点可以匹配正则表达式匹配中的任何字符。.$var

即如果 ,则匹配 ,等等......$var=2.txtsed -i '/2.txt/d' log.txt2.txt2atxt

${var//\./\\.}用于转义句点符号,以避免上述匹配。


如果目录路径始终跟在 filename 行后面,或者您可以精确匹配文件名并删除这两行,如下所示。

sed -i '/^'"${var//\./\\.}"'$/,+1 d' log.txt

如果您有以相同文件名结尾的行,这可能会有所帮助,而不需要删除这些行。

评论

0赞 DDisciple 4/17/2019
是的,它在运行 sed 命令时不会更改文件内容。我什至通过终端运行它。
0赞 Anubis 4/17/2019
你设置了变量吗?var
0赞 DDisciple 4/17/2019
是的,var 只是来自用户的参数,这将是文件名,目前只是 var 在“$@”中循环访问命令行中的所有参数
0赞 Anubis 4/17/2019
这应该适用于任何合理的现代版本。检查以下打印件(移除):sed1 4 52 3seq 5 | sed '/2/,+1 d'
0赞 DDisciple 4/17/2019
哈哈,这确实有效,但它仍然删除了 11.txt因为它在技术上仍然以 1.txt 非常烦人的错误:(结束