sedで貪欲でないマッチ[閉じる]

sedで貪欲でないマッチ[閉じる]

Bashスクリプトには次の変数があります。

file_name='this_is_the_hart_part.csv'

使用

var2=$(echo $file_name | sed -e 's/_{2}\(.*\)_{3}/\1/')

部分文字列 "the"(変数$ file_nameから2と3の間の下線付きの数字)を抽出したいと思います。

しかし、 $var2 は $file_name と同じです。 sedコマンドをどのように変更できますか?

ベストアンサー1

サポートされている正規表現の種類は、とのsed非欲張りな一致を許可しません*

3番目に区切られたフィールドを取得したいと思います_。これは最も簡単な方法ですcut

cut -d '_' -f 3

または以下を使用してawk

awk -F '_' '{ print $3 }'

または、シェルから対応するフィールドの最初の 2 つを連続して削除し、最後を切り取ります。

str=${file_name#*_}
str=${str#*_}
str=${str%%_*}

"$str"the最後の言葉ですね。最後のバリアントを使用することは、おそらく3つのバリエーションの中で最も速く安定しているでしょう。

変数置換は、最初の下線を含む先行ビットが削除された${variable#*_}文字列を生成します。最初の下線から最後まですべての内容が削除さ$variableれます。これは標準変数の置換です。${variable%%_*}$variable

ファイル名に変数置換を使用すると、改行文字を含むファイル名を処理できますが、or norawkは処理できないという利点があります。通常、ファイル名には行中心のテキスト編集ツールを使用しないでください。sedcut

また、引用符で囲まれていないecho $file_nameため$file_name、単語分割(デフォルトでは空白、タブ、および改行でもあるすべての文字$IFS)を実行し、結果の単語(ファイル名が一致する文字を含む場合)になります。現在のディレクトリのファイル名とシェルが一致することを確認します。ファイル名のバックスラッシュは消えたり、望ましくない影響を与える可能性があります(拡張子を引用しても)。引用符がない場合、シェルはksh値に対して中括弧拡張も実行します。$file_name

おすすめ記事