linux - 關於while read與sed混合使用的問題,sed吃掉了標準輸入的第一行
習慣沉默
習慣沉默 2017-06-10 09:48:43
0
1
1084

有crashcourse_test.txt文件,內容如下:

# cat crashcourse_test.txt 
1001|Anvils R Us|123 Main Street|Southfield|MI|48075|USA
1002|LT Supplies|500 Park Street|Anytown|OH|44333|USA
1003|ACME|555 High Street|Los Angeles|CA|90046|USA
1004|Furball Inc.|1000 5th Avenue|New York|NY|11111|USA
1005|Jet Set|42 Galaxy Road|London|NULL|N16 6PS|England
1006|Jouets Et Ours|1 Rue Amusement|Paris|NULL|45678|France
# 

while_read.sh腳本內容如下,目的是將上面文件內容作為標準輸入,傳入while read循環,透過sed指令將每一行的"USA"字符串替換為"XXXXXXXXX":

#!/bin/bash

while read line
do
        sed 's/USA/XXXXXXXXX/'
done < crashcourse_test.txt

輸出結果為:

# ./while_read.sh 
1002|LT Supplies|500 Park Street|Anytown|OH|44333|XXXXXXXXX
1003|ACME|555 High Street|Los Angeles|CA|90046|XXXXXXXXX
1004|Furball Inc.|1000 5th Avenue|New York|NY|11111|XXXXXXXXX
1005|Jet Set|42 Galaxy Road|London|NULL|N16 6PS|England
1006|Jouets Et Ours|1 Rue Amusement|Paris|NULL|45678|France
# 

可以看到,1001這一行含有"USA"字串(剛好也是檔案中的第一行),符合替換要求,但結果這行並未輸出。
我知道正確將它輸出的方法,可以使用echo $line | sed 's/USA/XXXXXXXXX/'來實現。
但我更想知道唯獨漏掉輸出第一行的原因。第一行作為標準輸入進入while read後去了哪裡?

習慣沉默
習慣沉默

全部回覆(1)
淡淡烟草味

首先你對 sed 的用法可能有誤.

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

它的參數是檔案, 你的變數line並沒有被使用.

while read line
do
    echo 3
    sed 's/USA/XXXXXXX/'
done < crashcourse_test.txt

输出:
3
1002|LT Supplies|500 Park Street|Anytown|OH|44333|XXXXXXX
1003|ACME|555 High Street|Los Angeles|CA|90046|XXXXXXX
1004|Furball Inc.|1000 5th Avenue|New York|NY|11111|XXXXXXX
1005|Jet Set|42 Galaxy Road|London|NULL|N16 6PS|England
1006|Jouets Et Ours|1 Rue Amusement|Paris|NULL|45678|France

從只輸出一個3 說明循環只執行了1 次. 所以你的文件重定向實際上被作為read的輸入和sed的輸入,並且read read

之後的全部作為輸入,所以就是第一行輸入你並沒有使用.🎜
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板