for 迴圈輸入行

for 迴圈輸入行

我有一個包含很多這樣的行的文件

/item/pubDate=2014 年 2 月 23 日星期日 00:55:04 +010

如果我執行這個

echo "/item/pubDate=Sun, 23 Feb 2014 00:55:04 +010" | grep -Po "(?<=\=).*"

Sun, 23 Feb 2014 00:55:04 +010

我得到了正確的日期(全部在一行中)。現在我想嘗試使用 xml 檔案中的大量日期。我用這個,沒問題。

xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*"
Fri, 22 Jan 2016 17:56:29 +0100
Sun, 13 Dec 2015 18:33:02 +0100
Wed, 18 Nov 2015 15:27:43 +0100
...

但現在我想在 bash 程式中使用日期,我得到了這個輸出

for fecha in $(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*"); do echo $fecha; done
    Fri,
    22
    Jan
    2016
    17:56:29
    +0100
    Sun,
    13
    Dec
    2015
    18:33:02
    +0100
    Wed,
    18
    Nov
    2015
    15:27:43
    +0100

我希望將日期輸出在一行中(在變數 fecha 中),如第一個和第二個範例所示,但我不知道該怎麼做。

答案1

這樣做:

while IFS= read -r fecha; do
    echo $fecha
done < <(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*")

Bash 將透過內部欄位分隔符號 ( ) 中的字元分隔要循環的「單字」$IFS。您可以透過IFS在命令執行期間設定為空來暫時停用此行為read。上面的模式總是逐行循環。

<(command)使命令的輸出看起來像一個真實的文件,然後我們將其重定向到read循環中。

$ while IFS= read -r line; do echo $line; done < <(cat ./test.input)
Fri, 22 Jan 2016 17:56:29 +0100
Sun, 13 Dec 2015 18:33:02 +0100
Wed, 18 Nov 2015 15:27:43 +0100

答案2

xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*" \
| while read L
  do
    echo $L
  done

除非有要求,否則不會斷行。 :-)

然而,使用正規表示式處理 XML 卻是一場槍戰。建構有效的 XML 非常容易,但上述管道要么會錯過,要么會錯誤地捕獲。

如果您處理大量 XML,您確實希望熟悉 SAX 解析器。

相關內容