登录

linux - 关于while read与sed混合使用的问题,sed吃掉了标准输入的第一行

有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后去了哪里?

# Linux
習慣沉默習慣沉默2016 天前699 次浏览

全部回复(1) 我要回复

  • 淡淡烟草味

    淡淡烟草味2017-06-10 09:50:43

    首先你对 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 次. 所以你的文件重定向< crashcourse_test.txt实际上被作为read的输入和sed的输入,并且sedread之后的全部作为输入,所以就是第一行输入你并没有使用.

    回复
    0
  • 取消回复发送