0

以下の FILTER 変数に示されているように、拡張子が sh、xls などのファイルを見つけようとしています。

以下は ls -ltr の出力です。以下のスクリプトの出力は hourly_space_update.sh および kent.ksh として表示されますが、.ksh ファイルは必要ありません。正規表現のどこが間違っているのか教えてください。

[root@SVRVSVN ~]# ls -ltr
total 20
-rw-r--r--  1 root sqaadmin   44 Oct  9 18:24 hourly_space_update.sh
-rw-r--r--  1 root sqaadmin    0 Oct 30 12:34 kent.ksh
-rw-r--r--  1 root sqaadmin    0 Oct 30 12:34 a.abc
-rw-r--r--  1 root sqaadmin    0 Oct 30 13:02 hh.h
#!/bin/sh

ls -ltr | awk '
BEGIN {
FILTER=".(sh|xls|xlsx|pdf)$"
}
{
for (i = 1; i < 9; i++) $i = ""; sub(/^ */, "");

if(match(tolower($1),FILTER))
{
   print $1
}
}'
4

5 に答える 5

2

この正規表現を試してください:

\.(sh|xls|xlsx|pdf)$
于 2012-10-30T07:57:09.160 に答える
1

これまでに得た回答で私が行ったコメントを参照してください。ただし、さらに重要なことは、フィールドの1つをテストするアプローチは、スペースを含むファイル名に対して失敗し、それらの空白の1つが改行である場合、パイプされたソリューションは失敗することです。シェルを次のように使用する必要があります。

ls -tr *.sh *.xls *.xlsx *.pdf

フィルターの必要性をまったく取り除きます。

ただし、 awk スクリプトを保持する必要がある場合、ファイル名にスペースが含まれていないことを保証できる場合は、次のように記述します。

ls -ltr | awk 'BEGIN{FILTER="\\.(sh|xlsx?|pdf)$"} tolower($NF) ~ FILTER { print $NF }'

「xslx?」以降、RE を省略したことに注意してください。"xls" または "xlsx" に一致します。

ただし、スペースや改行を含むファイル名の解決策を説明する前に、ファイル名のみを処理したい場合に、単に「ls -tr」ではなく「ls -ltr」を使用するのはなぜですか?

于 2012-10-30T12:25:54.783 に答える
1

bash/ksh/zsh では、ブレース展開を使用できます。

ls *.{sh,xls,xlsx,pdf}

また、 ls を解析しないでください

于 2012-10-30T14:48:37.280 に答える
0

( \bsh\b|\bxls\b|\bxlsx\b|\bpdf\b ) フィルターを試してください。

フィルターでは、sh シーケンスが含まれているため、.ksh ファイルが必要です。

于 2012-10-30T07:52:50.910 に答える
0

あなたのコードは、cygwin で実行されている私の gawk 4.0.1 で実際に動作します。

しかし、どうしてやりたくないのですか:

awk 'BEGIN {FILTER=".(sh|xls|xlsx|pdf)$"}{if(match(tolower($9),FILTER)){print $9}}'

これにより、for ループが冗長になり、コードが少しクリーンアップされます。ls -ltrの出力は、実行するたびに同じ形式を使用すると思います。:)

残念ながら、テスト用のクリーンなコマンドにアクセスすることはできませんが、それがあなたの問題である場合は、awk二重エスケープを試みることもできます。ヒントは、if ステートメントの前に、期待どおりの内容が含まれていることを確認することです。\\.awkprint $1

于 2012-10-30T10:40:22.353 に答える