次のファイル名形式のファイルがあります。
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"}'