我有一个看起来像这样的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(已经起作用),则新的log.txt文件将为
3.txt
/home/3.txt
我认为它基本上需要搜索log.txt并删除文件名及其下一行。
sed -i "/$var/d" log.txt
我尝试了此操作,但是它也会删除其中包含1.txt的文件,因此,如果文件为11.txt,也会将其删除。
答案 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.txt
,2atxt
等...
${var//\./\\.}
用于转义句号,从而避免上述匹配。
如果目录路径始终在文件名后,则可以与文件名进行精确匹配,并按如下所示删除这两行。
sed -i '/^'"${var//\./\\.}"'$/,+1 d' log.txt
如果您的行以相同的文件名结尾而无需删除,这可能会有所帮助。