提问人:DDisciple 提问时间:4/17/2019 最后编辑:AnubisDDisciple 更新时间:4/17/2019 访问量:250
如何从文本文件中删除确切的文本?
How to remove exact text from a text file?
问:
我有一个日志.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赞
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.txt
sed -i '/2.txt/d' log.txt
2.txt
2atxt
${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
这应该适用于任何合理的现代版本。检查以下打印件(移除):sed
1 4 5
2 3
seq 5 | sed '/2/,+1 d'
0赞
DDisciple
4/17/2019
哈哈,这确实有效,但它仍然删除了 11.txt因为它在技术上仍然以 1.txt 非常烦人的错误:(结束
上一个:如何获取查找命令的最后一个结果?
下一个:单击图像时移动图像的功能?
评论
sed -i "/$var/d" log.txt
sed -i "/^$var/d" log.txt
sed -i "/^$var$/d" log.txt