編集する

編集する

ピリオドで終わらないファイルをディレクトリから検索しようとしています。ピリオド/句読点の後に続く最後のASCII文字でファイル名を一覧表示しようとしています。私はすべてを見ましたが、これまで何も機能しません。どんな助けでも大変感謝します!

for file in ./dir/*;
do grep -o '[^[:punct:]]$' $file

出力:

filename  f
filename  d
filename  e

ファイル名の後の文字は、句読点ではなくファイルの最後の文字を表します。

空のファイルは、句読点で終わらないファイルとは異なる方法で処理する必要があります。空のファイルは無視されます。ファイル名を無視し、ファイル内のピリオド/句読点に具体的に言及しています。

mawkバージョン1.3.4を使用する必要があります。

答え1

これはおそらくGNU awkを使ってやりたいことですENDFILE

awk 'ENDFILE {
    if ( FNR ) {
        c = substr($0,length(),1)
        if ( c !~ /[[:punct:]]/ ) {
            print FILENAME, c
        }
    }
}' dir/*

または、POSIX awkを使用してください。

awk '
    FNR == 1 { prt(); fname=FILENAME }
    { lastRec = $0 }
    END { prt() }
    function prt(    c) {
        c = substr(lastRec,length(),1)
        if ( c !~ /[[:punct:]]/ ) {
            print fname, c
        }
    }
' dir/*

または、awk が POSIX でない場合 (現在持っている mawk 1 など) 他の awk で動作するようにするには、句読点[[:punct:]]文字 (文字、数字以外の文字)、制御文字のハードコーディングされたリストを含む角括弧式に置き換えます。または、空白文字などを使用するか、句読点文字(文字、数字、制御文字、または空白以外の文字)ではなく文字のリスト(toとtoなど)に比較を変更[-.,!=+]します。!~~[[:punct:]][a-zA-Z0-9 \t]

答え2

これは、ファイルのリストを別々のファイルとして扱うオプションと、Fファイル名を印刷するコマンドと一緒にGNU sedを使用して行うことができます。

$ sed -sn '${s/.*\(.\)$/\1/;/[^[:punct:]]/{F;l}}' ./*

./fileone
a$

./filetwo
s$

これらのファイルはすべてテキストファイルであると仮定します。そうしないと、複数の文字が印刷されることがあります。このlコマンドは、コンソールのネイティブバイナリ出力の問題を回避するために使用されます。

説明する

最初の行は$最後の行とのみ一致します。この行で外部を実行してください{...}

s/.*\(.\)$/\1/行全体を最後の文字に置き換えます。 1つ以上の文字がある行にあります。空行は変更されません。

punct次に、2番目の中括弧ペアの内容が()なしの行/[^[:punct:]]/で実行されます{...}。もちろん、これを行うには、空行を拒否する少なくとも1つの文字が一致する必要があります。

最後の行がないところで実行されるコードはファイル名を印刷し、行のpunct最後の文字値を印刷します(asciiでない場合はエンコードされます)。Fl

編集する

バイナリを避けるより厳格なバージョンは次のとおりです。

sed -sn '${/[[:print:]\t]$/!d;s/.*\(.\)$/\1/;/[^[:punct:]]/{F;l}}' ./*

最後の文字print(すべての数字、文字(大文字と小文字)、句読点、スペース)、またはタブ文字が存在しないファイルは処理されません。

答え3

最後に句読点なしでファイルの内容を見つける必要がある場合:

for f in ./* ; do tail -n 1 "$f" | grep -qv '[^[:punct:]]$' || echo "$f" ; done

最後に句読点なしでファイル名を見つける必要がある場合:

find . | grep -v '[[:punct:]]$'

関連情報