4

決めたデリメータの後ですべてを返す必要がありますが、それでもsedの使用方法が完全にはわかりません。私がする必要があるのは:

$ echo "ABC  DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," \
  | sed <some regexp>

この例では、戻り値は2番目のコンマの後の(部分文字列)すべてである必要があります。

123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,

私はこのようなカットでこれを行うことができます: echo "ABC DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,," | cut -d',' -f 2-

しかし、カットはsedよりも遅いと言われています...

それらを持っている(そしてしたい... :))何人かの教祖は私に彼の時間の数分を与えて私にアドバイスしてくれますか?ありがとう!レオ

4

3 に答える 3

3

私の経験cutでは、常により高速ですsed

あなたがやりたいことをsedするために、あなたは一致しないグループを使うことができます:

echo 'ABC  DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' |
  sed -r 's/([^,]*,){2}//'

これにより、最初の2つのフィールド(フィールド自体にコンマが含まれていない場合)が削除され、コンマ以外の文字の[^,]後にコンマが2回続きます{2}

出力:

123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,
于 2013-03-14T11:50:36.503 に答える
0

bash外部プロセスをまったく生成せずに、で抽出を実行することもできます。

$ [[ 'ABC  DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,' =~ [^,]*,[^,]*,(.*) ]]
$ echo "${BASH_REMATCH[@]}"
123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,

また

$ FOO='ABC  DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,'
$ echo ${FOO/+([^,]),+([^,]),}

また

$ IFS=, read -a FOO <<< 'ABC  DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,'
$ echo ${FOO[@]:2}

(これは1回限りの一致であり、ファイルの内容を反復処理するものではないと想定しています。)

于 2013-03-14T13:05:51.753 に答える
0

このメソッドは、文字の2番目の出現のインデックスを検索し、bashサブストリングを使用して必要な結果を取得することによって行われます。

input="ABC  DE,FG_HI J,123.XYZ-A1,DD/MM/YYYY HH24:MI:SS,,,"
index=$(($(echo $input| grep -aob '/' | grep -oE '[0-9]+' | awk 'NR==2') + 1))
result=${input:$index}
于 2020-05-14T07:09:46.893 に答える