![删除文件中以特定扩展名结尾的字符串](https://linux22.com/image/123161/%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E4%B8%AD%E4%BB%A5%E7%89%B9%E5%AE%9A%E6%89%A9%E5%B1%95%E5%90%8D%E7%BB%93%E5%B0%BE%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
需要删除文件中的 .sql 条目
我有包含以 .class 和 .sql 结尾的字符串的文件,我只需要删除文件中以 .sql 结尾的字符串
文件.txt
actual.class
actual1.class
actual2.class
actual3.class
actual4.class
test.sql
test2.sql
test3.sql
test4.sql
test5.sql
我期望的输出文件是
actual.class
actual1.class
actual2.class
actual3.class
actual4.class
使用下面的脚本但无法实现
for i in `cat file.txt` ; do
fname=`echo ${i} | cut -d "." -f1`
echo ${fname}
if file=${fname}.sql
then
sed "/${fname}.sql/d" file.txt > output_file.txt
else
exit 0
fi
done
上面的脚本得到低于输出
actual.class
actual1.class
actual2.class
actual3.class
actual4.class
test.sql
test2.sql
test3.sql
答案1
grep
解决方案:
grep -q '.\.sql$' file.txt && grep -v '\.sql$' file.txt > output_file.txt
仅当第一个语句/命令返回零退出状态(如果找到任何与模式匹配的情况)grep
时,才会执行第二个语句/命令0
.\.sql$
最终output_file.txt
内容:
actual.class
actual1.class
actual2.class
actual3.class
actual4.class
答案2
使用
sed
sed '/\.sql$/d' test.txt
对于 bash (3.2+)
while read -r line; do [[ ! $line =~ .sql ]] && echo "$line"; done <test.txt
使用perl
perl -ni.bak -e "print unless /.sql/" test.txt
答案3
另一个 grep,只需反转匹配
grep -v "\.sql$" filelist
答案4
我认为在这篇文章之前已经有很好的解决方案了。不过,我想指出最初发布的脚本的几个问题。
for i in $(cat ...)
不好,因为它默认情况下也用空格分隔您的输入,而不仅仅是换行符。- if 语句没有意义,因为
file
未定义。对于典型的if
语句,您需要调用test
,通常是将内容放在一对方括号内。例如,if [ $f = "abc" ]; then
。请注意,此处的所有空格都是必需的。 exit 0
阻止脚本处理给定行之后的所有行,我相信这不是有意的。