ファイルから特定の拡張子で終わる文字列を削除する

ファイルから特定の拡張子で終わる文字列を削除する

ファイルから.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

grep2番目のステートメント/コマンドは、最初のステートメント/コマンドが終了ステータス0を返した場合にのみ実行されます(パターンに一致するケースが見つかった場合)。0.\.sql$


最終output_file.txtコンテンツ:

actual.class
actual1.class
actual2.class
actual3.class
actual4.class

答え2

  • 使用sed

    sed '/\.sql$/d' test.txt
    
  • バッシュ(3.2+)の場合

    while read -r line; do [[ ! $line =~ .sql ]] && echo "$line"; done <test.txt
    
  • パールを使って

    perl -ni.bak -e "print unless /.sql/" test.txt
    

答え3

もう一つのgrep、マッチを逆にしてください

grep -v "\.sql$" filelist

答え4

この記事の前にもすでに良い解決策があると思います。しかし、もともと公開されたスクリプトにいくつかの問題があることを指摘したいと思います。

  • for i in $(cat ...)基本的には改行文字だけでなく、スペースで入力を区切っているので良いことではありません。
  • fileif文は定義されていないため意味がありません。一般的なステートメントの場合、通常は一対の角カッコの中に内容を囲むことをif呼び出す必要があります。testたとえば、if [ $f = "abc" ]; then。ここにあるスペースはすべて必須です。
  • exit 0スクリプトが特定の行以降のすべての行を処理するのを防ぎます。これは意図的なものではないと思います。

関連情報