suchen

Heim  >  Fragen und Antworten  >  Hauptteil

linux – Bei der gemischten Verwendung von while read und sed frisst sed die erste Zeile der Standardeingabe

Es gibt eine crashcourse_test.txt-Datei mit folgendem Inhalt:

# 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
# 

Der Inhalt des while_read.sh-Skripts ist wie folgt: Der Zweck besteht darin, den oben genannten Dateiinhalt als Standardeingabe zu verwenden, ihn an die while-Leseschleife zu übergeben und die Zeichenfolge „USA“ in jeder Zeile durch „XXXXXXXXX“ zu ersetzen sed-Befehl:

#!/bin/bash

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

Das Ausgabeergebnis ist:

# ./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
# 

Sie können sehen, dass die Zeile 1001 die Zeichenfolge „USA“ enthält (was zufällig die erste Zeile in der Datei ist), die die Ersetzungsanforderungen erfüllt, aber das Ergebnis ist, dass diese Zeile nicht ausgegeben wird.
Ich kenne den Weg zur korrekten Ausgabe, was mit echo $line | sed 's/USA/XXXXXXXXX/' erreicht werden kann.
Aber ich möchte wissen, warum nur die erste Ausgabezeile fehlt. Wohin geht die erste Zeile nach der Eingabe von while read als Standardeingabe?

習慣沉默習慣沉默2732 Tage vor1096

Antworte allen(1)Ich werde antworten

  • 淡淡烟草味

    淡淡烟草味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之后的全部作为输入,所以就是第一行输入你并没有使用.

    Antwort
    0
  • StornierenAntwort