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

时间:2019-04-16 17:52:27

标签: bash

我有一个看起来像这样的log.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(已经起作用),则新的l​​og.txt文件将为

3.txt
/home/3.txt

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

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

我尝试了此操作,但是它也会删除其中包含1.txt的文件,因此,如果文件为11.txt,也会将其删除。

1 个答案:

答案 0 :(得分:0)

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.txt,则sed -i '/2.txt/d' log.txt匹配2.txt2atxt等...

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


如果目录路径始终在文件名后,则可以与文件名进行精确匹配,并按如下所示删除这两行。

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

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