文字列から2番目と最後のフィールドをキャプチャ

文字列から2番目と最後のフィールドをキャプチャ

次のファイル名形式のファイルがあります。

VER_{ファイル名}_{バージョン}

はい

  VER_collect_important_info.pl_1.0.2

私たちは「ファイル名」と「バージョン」番号だけをキャプチャしたいと思います。

「ファイル名」と「バージョン」をキャプチャできるように、ファイル名から最初の_と最後の_を削除するにはどうすればよいですか(sed / awkまたはPerl one-linerを使用)

はい

 echo VER_collect_important_info.pl_1.0.2 | <some syntax>

 collect_important_info.pl  1.0.2

答え1

Perlは軽い選択肢よりも私にもっと自然な感じを与えます。

echo VER_collect_important_info.pl_1.0.2 | perl -pe 's/^[^_]*_(.*)_(.*)$/$1 $2/'

これが必要以上に重い重みを使用することが重要でない場合は、ここで停止します。

sedはこれを行うことができますが、括弧などの基本要素をエスケープする必要があることは面倒です。

echo VER_collect_important_info.pl_1.0.2 | sed 's/VER_\(.*\)_\(.*\)/\1 \2/'

答え2

これはトリックを行う必要があります

$ echo VER_collect_important_info.pl_1.0.2 | sed 's/_/ /' | sed -r 's/(.*)_/\1 /' | awk -F" " '{print $2"\t"$3}'

最初のsedは最初の項目を置き換え_、2番目のsedは最後の項目を置き換え_、最後にawkとして印刷します。

答え3

$ echo 'VER_collect_important_info.pl_1.0.2' | 
    perl -F_ -lane 'print join("_", @F[1..@F-2]), " ", @F[@F-1]'
collect_important_info.pl 1.0.2

注:perl配列は1ではなく0から始まるので、2番目のフィールドの配列インデックスはでは[1]ありません[2]

これにより、入力は@F下線文字で区切られた配列()に分割されます。_次に、2番目のフィールドを2番目から最後のフィールド(@F[1..@F-2])に印刷し、アンダースコアで連結し、スペース、最後のフィールド(@F[@F-1])を印刷します。

答え4

awkでは、次のことができます。

echo VER_collect_important_info.pl_1.0.2 | awk -F '_' '{for (i=2; i<NF; i++) {{printf $i} if (i!=NF-1) printf "_"} printf " " $NF "\n"}'

関連情報