2

UNIX で次の文字列をフィルタリングしようとすると問題が発生します

<option value="20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option>

に: 20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg2012-12-09 13:00. 必要な部分文字列の先頭は見つかりますが、末尾は見つかりません。

 file=tmpfile
 read -r firstline<$file
 firstArg=$(echo $firstline | sed 's/^.*value="//' | sed 's/">*$//')
 echo $firstArg
 secondArg=$(echo $firstline | sed 's/^.*">//' | sed 's/h<*$//')
 echo $secondArg

出力は次のとおりです。

20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option>
2012-12-09 13:00h</option>

しかし、私が本当に欲しいのは

20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg
2012-12-09 13:00
4

2 に答える 2

2

マイナーな修正、.2つの場所で欠落しています(各行*の2番目の前):sed

 file=tmpfile
 read -r firstline<$file
 firstArg=$(echo $firstline | sed 's/^.*value="//' | sed 's/">.*$//')
 echo $firstArg
 secondArg=$(echo $firstline | sed 's/^.*">//' | sed 's/h<.*$//')
 echo $secondArg

入力:

<option value="20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option>

出力:

20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg
2012-12-09 13:00

説明:

  • *前の文字と0回以上一致するため、以前は0個以上>のとを一致させて<いました。
  • 任意の.文字に一致します
  • したがって、。>.*の後の0個以上の文字に一致します>

改善:

さらに、2sed行は次のように書くとよいでしょう。

 firstArg=$(sed 's/^.*value="//;s/">.*$//' <<< "$firstline")
 secondArg=$(sed 's/^.*">//;s/h<.*$//' <<< "$firstline")
  • ;1つのsed呼び出し内で複数の置換パターンを分離する
  • <<<表記はherestringと呼ばれ、代わりに使用することでエコーとパイプをここに保存できます
  • 変数は常に二重引用符で囲みます
于 2012-12-09T16:14:14.437 に答える
1

これを試してみてください:

sed -r 's@.*([0-9]{8}/[^"]+).*>([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}[[:alnum:]]*)<.*@\1\n\2@g'

$ cat file.txt
<option value="20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option>
$ sed -r 's@.*([0-9]{8}/[^"]+).*>([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}[[:alnum:]]*)<.*@\1\n\2@g' file.txt
20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg
2012-12-09 13:00h
于 2012-12-09T16:13:58.493 に答える