Beim Zuweisen einer Befehlsausgabe an eine Variable werden die neuen Zeilen durch Leerzeichen ersetzt

Beim Zuweisen einer Befehlsausgabe an eine Variable werden die neuen Zeilen durch Leerzeichen ersetzt

Ich habe eine Datei und die Idee ist, den Inhalt nach einem Muster („Erstellungsmodus“) zu greppen und diesen Inhalt in einer Bash-Variable zu speichern, um ihn dann in einer Curl-Anweisung zu verwenden. Bei mir funktionieren die Befehle, aber das Problem ist, dass beim Zuweisen der Ausgabe an die Variable die neuen Zeilen durch Leerzeichen ersetzt wurden.

Beispiel einer Datei

...
example1
example2
 create mode 100644 repo/linux-image-5.4.0-89-generic_5.4.0-89.100_amd64.deb
 create mode 100644 repo/linux-modules-5.4.0-89-generic_5.4.0-89.100_amd64.deb
 create mode 100644 repo/python3.8-minimal_3.8.10-0ubuntu1~20.04.1_amd64.deb
 create mode 100644 repo/python3.8_3.8.10-0ubuntu1~20.04.1_amd64.deb
example3
example4
...

Ich muss greppennurdie Ubuntu-Pakete und speichern sie in einer Bash-Variable var. Die Idee ist, das Format beizubehalten (mit der \n)

Ich habe versucht, grep und sed zu verwenden, die Ausgabe mit printf zu ändern und die Ausgabe einer Variablen zuzuweisen.

Beispiel mitgrep and printf

test_variable=$( cat file.txt | grep "create mode" )
var=$( printf '%s\n' "${test_variable//' create mode 100644 repo/'/}" )
echo $var
repo/linux-image-5.4.0-89-generic_5.4.0-89.100_amd64.deb repo/linux-modules-5.4.0-89-generic_5.4.0-89.100_amd64.deb repo/python3.8-minimal_3.8.10-0ubuntu1~20.04.1_amd64.deb repo/python3.8_3.8.10-0ubuntu1~20.04.1_amd64.deb

Als ich denselben printf-Befehl verwendete, die Ausgabe jedoch nicht einer Variablen zuwies, war das Ergebnis:

linux-image-5.4.0-89-generic_5.4.0-89.100_amd64.deb
linux-modules-5.4.0-89-generic_5.4.0-89.100_amd64.deb
python3.8-minimal_3.8.10-0ubuntu1~20.04.1_amd64.deb
python3.8_3.8.10-0ubuntu1~20.04.1_amd64.deb

Ich habe versucht, trzur Fehlerbehebung Folgendes zu verwenden: und andere.

Anderes Beispiel mitsed

sed -e '/create mode/!d' file.txt
 create mode 100644 repo/linux-image-5.4.0-89-generic_5.4.0-89.100_amd64.deb
 create mode 100644 repo/linux-modules-5.4.0-89-generic_5.4.0-89.100_amd64.deb
 create mode 100644 repo/python3.8-minimal_3.8.10-0ubuntu1~20.04.1_amd64.deb
 create mode 100644 repo/python3.8_3.8.10-0ubuntu1~20.04.1_amd64.deb

Das ist ok. Aber als ich versuchte, diese Ausgabe einer Variablen zuzuweisen, wurden die Zeilenumbrüche durch ein Leerzeichen ersetzt.

var=$( sed -e '/create mode/!d' file.txt )
echo $var
create mode 100644 repo/linux-image-5.4.0-89-generic_5.4.0-89.100_amd64.deb create mode 100644 repo/linux-modules-5.4.0-89-generic_5.4.0-89.100_amd64.deb create mode 100644 repo/python3.8-minimal_3.8.10-0ubuntu1~20.04.1_amd64.deb create mode 100644 repo/python3.8_3.8.10-0ubuntu1~20.04.1_amd64.deb

Könnten Sie mir dabei helfen? Danke

Antwort1

Wenn Sie es verwenden, echo "$var"wird es problemlos funktionieren:

$ valor=$( cat <<EOF
> hola
> adios
> EOF
> )
$ echo $valor
hola adios
$ echo "$valor"
hola
adios
$

verwandte Informationen