2016-08-02 11 views
1

In Linux C Shell muss ich eine Zeile in einer Datei durch eine Variable ersetzen, die eine Reihe von Zahlen und eine Zeichenfolge enthält. Ich verwende eine Kombination aus printf, xargs und sed, um die Formatierung beizubehalten, wie von this answer vorgeschlagen. Dies ist mein Code bis jetzt (ich nicht einen einfacheren Ansatz in csh finden konnte):xargs behält keine führenden Leerzeichen im Format

> echo " 2 2 2 2 2 2 2 2  Number of gradient directions" > myfile.txt 
> set ndir = `repeat 8 printf ' 2'` 
> set ndir[1] = 16 
> set afmt1 = `repeat 8 printf '%%3d'` 
> set afmt = "$afmt1%s" 
> printf "$afmt" $ndir "  Number of gradient directions" | xargs -I '{}' sed -i '/Number of gradient directions/c\{}' myfile.txt 

Das Ergebnis ist:

> cat myfile.txt 
16 2 2 2 2 2 2 2  Number of gradient directions 

Aber ich brauche:

> cat myfile.txt 
16 2 2 2 2 2 2 2  Number of gradient directions 

Das einzige Problem ist, dass die Zeile das% 3d-Format nur für den ersten Index der Variablen $ ndir verliert. Ich muss dieses Format für die gesamte Zeile beibehalten. Gibt es einen subtileren Weg oder eine Lösung für diesen Weg?

Antwort

1

hinzufügen -d'\n' zu Ihrem xargs Befehl:

printf "$afmt" $ndir "  Number of gradient directions" | xargs -d'\n' -I '{}' sed -i '/Number of gradient directions/c\{}' myfile.txt 

Das Problem ist, dass xargs Ordnungen von jeder Eingangsleitung führende Leerzeichen, wenn -I verwenden, die Sie wie folgt überprüfen können:

% echo ' A B ' | xargs -I {} echo "[{}]" 
[A B ] 

Das Hinzufügen der Option -d'\n' deaktiviert dieses Verhalten und bewirkt, dass die gesamte Zeile unverändert übergeben wird:

% echo ' A B ' | xargs -d'\n' -I {} echo "[{}]" 
[ A B ] 

Als Neben (nicht relevant für Linux):

BSD/OSX xargs nicht nur beide Ordnungen führende und nachfolgende Leerzeichen mit -I, normalisiert auch Line-Innen Leerzeichen; Da BSD/OSX xargs nicht die -d Option nicht unterstützt, wird die folgende Problemumgehung Linien passieren benötigt, wie sie ist (auch mit GNU xargs funktionieren würde):

% echo ' A B ' | tr '\n' '\0' | xargs -0 -I {} echo "[{}]" 
[ A B ] 
+0

Sie sind erstaunlich, danke. Ich habe den Titel meiner Frage geändert, damit andere ihre relevante Frage leichter finden können. –

+0

@ S.M: Ich danke Ihnen für die Aktualisierung des Fragetitels. – mklement0

Verwandte Themen