Awk:RegExpパターンマッチの実際の値の抽出

Awk:RegExpパターンマッチの実際の値の抽出

次のawkコードセクションには、ファイル名と完全なLinuxパスが含まれています。これには、日付file型ディレクトリとしてYYMMDDを含めることができます。backup-YYMMDD

isDate[file]つまり、YYMMDDを割り当てたいのですisDate[file]=YYMMDD

どうすればいいですか?

for (file in files) {
        if ( file ~ /(^|\/)(library|labs data|current)(\/|$)/ ) {
           isKeep[file]
        }
        else if ( file ~ /(^|\/)(backup-[0-2][0-9][0-1][0-9][0-3][0-9])(\/|$)/ ) {
            isDate[file]
        }
        else {
            isDelete[file]
        }
}

ベストアンサー1

GNUには、パターンとして特徴付けられる文字列コンポーネントの実際の値を抽出するためのコマンドがawkあります。matchだからあなたは使用することができます

match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats);
isDate[file]=pats[1]

else if ....プログラムの一部です。 (配列)変数は、次から始まり、patsすべてのRegExp(...)の文字列に含まれるすべてのサブ式で埋められます。インデックス1pats[0]実際の値になります。みんな表現する)。グループ化された(backup-YYMMDD部分的に)1つのサブ式のみがあるため、探してpats[1]いるものが含まれます。

または、単に試してみることができます

...
   else if (match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats)==1) {
      isDate[file]=pats[1]
   }
...

もちろん、このアプローチは次の点に依存します。単一パターンのパスコンポーネントを含みますbackup-YYMMDD

編集する(OPのコメント、@macxpat)

"^[[:print:]] ... $"この回答では、正規表現を指定するために文字列定数()を使用しました。しかし、次のようにGNU Awkユーザーガイド正規表現定数として指定する方がよりきれいで効率的です。。したがって、活用する方が良いです。

match(file,/^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$/,pats)

上記の例では!

おすすめ記事