1

ファイル名の長いリストをフォームに渡したい

something_0230232_long_5160mK.csv
something_0230232_long-025160mK.csv
simething_0230342_lingk425460mK.csv

sed(または同様のLinuxシェルツール)を使用して、行ごとにmKより前の最後の桁の配列を常に取得します

これは、正確に6桁の場合に機能します。どうすればn桁に拡張できますか?

echo "something_0230232_long_025160mK.csv" | sed -e "s/S.*\([0-9]\{6\}\)mK\.csv/\1/p" 
4

3 に答える 3

4

GNU を使用したソリューションgrep:

$ grep -Po '[0-9]+(?=mK)' file

5160
025160
425460

説明:

-o一致する行の部分のみを表示します。

-P perl 正規表現を使用します。

[0-9]+     # Match a string of digits (at least one)
(?=mK)     # Followed by mK (positive lookahead)

そしてsed (あなたが尋ねたので)

sed -E 's/.*[^0-9]([0-9]+)mK.*/\1/' file

-E拡張正規表現を使用します(移植性を高めるためのエイリアス)。-r

s/         # Subsitution -
.*         # Match everything
[^0-9]     # That's not a digit
([0-9]+)   # Capture the last digit string
mK         # Followed by the string mK
.*         # Match everything left
/          # Replace with -
\1         # The captured digit string only
/          #  
于 2012-11-24T21:01:59.903 に答える
1

あなたはあなたのsedコマンドで正しい軌道に乗っています:

echo "something_0230232_long_025160mK.csv" |
sed -e 's/^.*[^0-9]\([0-9]\{1,\}\)mK\.csv/\1/'

違い:

  • に置き換えSます^。これは最初に一致します (データには no がないSため、元のものは一致しません)。
  • に置き換え6ます1,。これは、コンテキストが与えられた「1 つ以上の数字」を意味します (厳密には、前の正規表現の 1 つ以上の繰り返しですが、前の正規表現は でした[0-9])。
  • を挿入して、が貪欲になりすぎない[^0-9]ようにします。.*一致する桁数を固定 ( \{6\}) にすると、剛性.*が高くなりすぎるのを防ぎました。柔軟な範囲が 2 つある場合、最初の範囲が可能な限り長くなります。がない[^0-9]場合0は、サンプル文字列の が出力されます。
  • 'p' を削除して、値が 1 回出力されるようにします。または、 を保持してオプションとしてp追加-nします。

自分へのリマインダー: 投稿する前 (または直後) にテストしてください。

于 2012-11-24T21:27:38.120 に答える
0
echo "something_0230232_long_025160mK.csv" | sed 's/^.*_//' | sed 's/mK.csv//'
于 2012-11-24T20:59:40.227 に答える