0
votes

Utilisez la sortie de SED pendant un moment de lecture en lecture

Je veux que la boucle tandis que vous ignorez les lignes et lignes vides (vides) contenant #

J'ai essayé, y compris SED -E 'S /#.*$//' -E '/ ^ $ / D' sur le fichier d'entrée et tuyer cela dans la boucle tandis que. Cela n'a pas fonctionné. P>

file=$(sed -e 's/#.*$//' -e '/^$/d' foo.txt)

while IFS=: read -r f1 f2 f3 f4; do 

Command

done <"$file"


0 commentaires

3 Réponses :


4
votes

Vous essayez d'ouvrir cette sortie en tant que nom de fichier, ce qui n'est certainement pas certainement.

exécutez SED dans un sous-groupe et rediriger sa sortie à la place de la boucle. xxx

pour toute personne intéressée par la manière dont la syntaxe utilisée dans cette réponse fonctionne, voir Wiki Hackers de Bash sur la substitution de processus , et pour la raison pour laquelle cette syntaxe est meilleure que sed ... | Tout en lisant ... , voir Bashfaq # 24 . < / p>


0 commentaires

-2
votes

Utiliser grep -v: xxx


4 commentaires

Cela fonctionne certainement, mais le problème n'est pas avec le code SED , c'est comment ils obtiennent leur résultat dans le en lecture boucle. Ainsi, cette réponse remplace une pièce de code de travail avec un code de travail différent , mais ne résout pas le bug que l'OP est question.


Si vous lisez le titre, alors oui. Mais c'est la première ligne du poteau: "Je veux que la boucle tandis que la boucle d'ignorer les lignes et les lignes vides (vides) contiennent #" OP essayé avec SED, je suggère d'utiliser Grep.


Voici la chose, mais - la chose que l'OP essayé avec SED fonctionne bien . Vous suggérez qu'ils changent la partie qui fonctionne déjà, pas la partie qui est cassée. Le bug n'est pas causé par fichier = $ (SED -E 'S /#.*$//' -E '/ ^ $ / d' foo.txt) faire autre chose que ce que OP s'attend à ce que cela puisse changer cette ligne sur fichier = $ (grep -v '# | ^ $') ou tout ce qui ne le répare pas.


... au lieu de cela, le problème est causé par <"$ fichier" itération sur un fichier nommé par la sortie de leur sed SED, ou votre commande grep ; Commutation Laquelle de ces deux commandes interchangeables est utilisée de manière non pertinente pour s'ils touchent cette question à moins que l'autre, le code ultérieur soit corrigé.



0
votes

Vous pouvez utiliser grep : xxx


2 commentaires

Même grep -e n'est pas garanti de supporter \ s ; Seule la syntaxe REGEX documentée dans la norme POSIX EERE est disponible sur toutes les plateformes et \ s - comme une autre séquence de backslash-séquence sténographie - n'est pas là. Pour avoir pris en charge la garantie sur toutes les plates-formes POSIX, utilisez [[: espace:]]] à la place.


... Donc, l'utilisation de grep ne résout rien (l'ancienne commande sed fonctionne bien) et (avec l'utilisation de \ s ) introduit les problèmes de portabilité; L'utilisation d'un tuyau fait corrige le problème de l'OP, mais elle la corrige d'une manière qui introduit Différents bugs .