删除文件中以特定扩展名结尾的字符串

删除文件中以特定扩展名结尾的字符串

需要删除文件中的 .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阻止脚本处理给定行之后的所有行,我相信这不是有意的。

相关内容