Maison  >  Questions et réponses  >  le corps du texte

linux - Concernant l'utilisation mixte de while read et sed, sed mange la première ligne d'entrée standard

Il existe un fichier crashcourse_test.txt avec le contenu suivant :

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

Le contenu du script while_read.sh est le suivant. Le but est d'utiliser le contenu du fichier ci-dessus comme entrée standard, de le transmettre dans la boucle while read et de remplacer la chaîne "USA" dans chaque ligne par "XXXXXXXXX" via le script while_read.sh. commande sed :

#!/bin/bash

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

Le résultat de sortie est :

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

Vous pouvez voir que la ligne 1001 contient la chaîne "USA" (qui se trouve être la première ligne du fichier), qui répond aux exigences de remplacement, mais le résultat est que cette ligne n'est pas affichée.
Je connais le moyen de le sortir correctement, ce qui peut être réalisé en utilisant echo $line | sed 's/USA/XXXXXXXXX/'.
Mais je veux connaître la raison pour laquelle seule la première ligne de sortie est manquée. Où va la première ligne après avoir entré le while read comme entrée standard ?

習慣沉默習慣沉默2687 Il y a quelques jours1058

répondre à tous(1)je répondrai

  • 淡淡烟草味

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

    Tout d’abord, votre utilisation de sed est peut-être erronée.

    sed [OPTION]... {script-only-if-no-other-script} [fichier d'entrée]...

    Son paramètre est un fichier, votre variable line n'est pas utilisée

    .
    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

    En produisant seulement un 3, cela signifie que la boucle n'est exécutée qu'une seule fois Donc votre redirection de fichier < > et < crashcourse_test.txt实际上被作为read的输入和sed的输入,并且sedread entrée, et

    utilisez tout après read comme entrée, vous n'avez donc pas utilisé la première ligne d'entrée.🎜

    répondre
    0
  • Annulerrépondre