linux - Concernant l'utilisation mixte de while read et sed, sed mange la première ligne d'entrée standard
習慣沉默
習慣沉默 2017-06-10 09:48:43
0
1
1089

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 ?

習慣沉默
習慣沉默

répondre à tous(1)
淡淡烟草味

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.🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal