
ファイルから.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
2番目のステートメント/コマンドは、最初のステートメント/コマンドが終了ステータス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 ...)
基本的には改行文字だけでなく、スペースで入力を区切っているので良いことではありません。file
if文は定義されていないため意味がありません。一般的なステートメントの場合、通常は一対の角カッコの中に内容を囲むことをif
呼び出す必要があります。test
たとえば、if [ $f = "abc" ]; then
。ここにあるスペースはすべて必須です。exit 0
スクリプトが特定の行以降のすべての行を処理するのを防ぎます。これは意図的なものではないと思います。