5

私は以下のようにフォーマットされた文字列を持っています

Walk Off the Earth - Somebody That I Used to Know
[playing] #36/37   1:04/4:05 (26%)
volume: n/a   repeat: off   random: on    single: off   consume: off

さて、上記の文字列から、から抽出する必要があり36ます#36/37

私が最初にしたことは#36/37、2行目から抽出することでした

echo "above mentioned string" | awk 'NR==2 {print $2}'

36さて、上記で抽出した部分から抽出したいのですが

echo `#36/37` | sed -e 's/\//#/g' | awk -F "#" '{print $2}'

それは私36のアウトプットとして私を与えました。

sed and awkしかし、テキストを抽出するためだけに両方を使用#36/37するのはやり過ぎだと思います。それで、これを達成するためのより良いまたはより短い方法はありますか?

4

8 に答える 8

5

ポンド文字とスラッシュ文字のフィールドを配列に分割し、必要な要素を取得します。

awk 'NR==2 {split($2, arr, "[#/]"); print arr[2]}'
于 2012-07-07T20:30:55.707 に答える
3

=~この回答は、テスト演算子を使用したbashの組み込みの拡張正規表現構文を利用しています。(私は言いますtestが、コマンドで機能することを期待しないでください。キーワードtestでのみ機能します。)[[

mini:~ michael$ cat foo
Walk Off the Earth - Somebody That I Used to Know
[playing] #36/37   1:04/4:05 (26%)
volume: n/a   repeat: off   random: on    single: off   consume: off

mini:~ michael$ [[ $(<foo) =~ \#[[:digit:]]{2} ]] && echo "${BASH_REMATCH[0]#\#}"
36

BASH_REMATCH要約すると、これはポンド記号の後の2桁に一致する正規表現であり、配列の0番目の要素に保存されます。

于 2012-07-07T20:47:48.597 に答える
2
sed -n '2s/.*\#\([0-9]*\)\/.*/\1/p'

#これにより、2行目以外はすべて抑制され、との間の数字がエコーされます。/

于 2012-07-07T20:41:21.300 に答える
2

sed仮定を使用する1つの方法infileには、質問の内容があります。2行目では、までの任意の文字と一致し#、次にグループ1の任意の数字を保存し、行全体をこのグループに置き換え\1ます。コードに指示がない限り、-nスイッチは何も印刷しません。p

sed -ne '2 { s/^[^#]*#\([0-9]*\).*$/\1/; p; q }' infile

出力:

36
于 2012-07-07T20:28:26.887 に答える
2

これはあなたのために働くかもしれません:

sed 's/.*#\([0-9]*\)\/[0-9]*.*/\1/p;d' file
36
于 2012-07-07T20:33:15.790 に答える
2
input | while read playing numbers rest
do
  if [[ $playing = "[playing]" ]]; then
    t="${numbers:1}"
    echo "${t%/*}"
  fi
done

Bashのデフォルトの分割は空白によるものであるため、2番目のフィールド(数値)に表示されるのはその数値だけです。残りは、bashパラメーター展開演算子を使用して、関心のある部分を取得することです。最初の文字を削除し、「/」で始まるサフィックスを削除します。

于 2012-07-07T20:33:29.357 に答える
2

これはあなたの問題を解決するでしょう。

awk -F'[#/]' 'NR==2{print $2}'
于 2012-07-09T11:43:36.930 に答える
0

最初の文字と最後の文字の間の文字列を出力するスクリプトを作成しました。問題を解決するには、次のコマンドをこのスクリプトと組み合わせて使用​​できます。

echo '[playing] #36/37   1:044:05 (26%)' | cut -d' ' -f2 | ./cut_between.sh -f '#' -l '/'

このスクリプトはGitHubからダウンロードできます。

于 2013-02-22T08:13:26.633 に答える