staging.inyokaproject.org

Linux: Bash: Sed-Ersetzung

Status: Gelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Umaash

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Gegeben:

Variable "ZeilenAktion1Arrey[i]" enthält:

bbb\nccc\n

Variable "ZeilenAktion2Arrey[i]" enthält:

g\.h"f\*$g"fd'd\/f#@%q\\n&='f\\g\\\\\/\/=?+\[\]{|()^`n`$r`a\\d,\\s\\w\\t\\r\\p{xx}f><~b\\s\\S\\w\\	W\n

Datei "/etc/environment" enthält:

aaa
bbb
ccc
ddd

Befehl:

1
2
ZeilenAktion1Arrey[i]=$(sed ":a;N;\$!ba;s/${ZeilenAktion1Arrey[i]}/${ZeilenAktion2Arrey[i]}/g" "/etc/environment")
echo "${ZeilenAktion1Arrey[i]}"

erwarteter Output:

aaa
g.h"f*$g"fd'd/f#@%q\n&='f\g\\//=?+[]{|()^`n`$r`a\d,\s\w\t\r\p{xx}f><~b\s\S\w\	W
ddd

tatsächlicher Output:

aaa
g.h"f*$g"fd'd/f#@%q\nbbb
ccc
='f\g\\//=?+[]{|()^`n`$r`a\d,\s\w\t\r\p{xx}f><~b\s\S\w\	W
ddd

Frage: Wo liegt der Fehler, der dazu führt, dass ich nicht den erwarteten Output erhalte? Eine Antwort würde mich freuen.

Es scheint irgendetwas mit dem "&" zu tun zu haben. Aber was genau? "&" ist doch kein Regex-Sonderzeichen. Deshalb verstehe ich nicht, weshalb es hier stört.

Edit:

Vereinfachung:

Gleiches Verhalten, wenn die Variable "ZeilenAktion2Arrey[i]" folgendes enthält: q\\n&='f\n

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

Es scheint irgendetwas mit dem "&" zu tun zu haben. Aber was genau?

Was immer du da für schräges Zeug vorhast aber "sed" hat genau das gemacht, was du wolltest. Das "&" Zeichen fügt den gefundenen Teil des Strings ein. Wenn du das nicht haben willst, musst du auch "&" in Ersetzt-String (ZeilenAktion2Arrey[i] ) escapen. Also:

$ i=1
$ ZeilenAktion1Arrey[i]="bbb\nccc\n"
$ cat x.x
g\.h"f\*$g"fd'd\/f#@%q\\n\&='f\\g\\\\\/\/=?+\[\]{|()^`n`$r`a\\d,\\s\\w\\t\\r\\p{xx}f><~b\\s\\S\\w\\	W
$ read -r ZeilenAktion2Arrey[i] <x.x
$ set -x
$ sed --debug ":a;N;\$!ba;s/${ZeilenAktion1Arrey[i]}/${ZeilenAktion2Arrey[i]}/g" "/etc/environment"
+ sed --debug ':a;N;$!ba;s/bbb\nccc\n/g\.h"f\*$g"fd'\''d\/f#@%q\\n\&='\''f\\g\\\\\/\/=?+\[\]{|()^`n`$r`a\\d,\\s\\w\\t\\r\\p{xx}f><~b\\s\\S\\w\\	W/g' /etc/environment
SED PROGRAM:
  :a
  N
  $! b a
  s/bbb\nccc\n/g.h"f*$g"fd'd/f#@%q\n&='f\g\\//=?+[]{|()^`n`$r`a\d,\s\w\t\r\p{xx}f><~b\s\S\w\	W/g
INPUT:   'environment' line 1
PATTERN: aaa
COMMAND: :a
COMMAND: N
PATTERN: aaa\nbbb
COMMAND: $! b a
COMMAND: :a
COMMAND: N
PATTERN: aaa\nbbb\nccc
COMMAND: $! b a
COMMAND: :a
COMMAND: N
PATTERN: aaa\nbbb\nccc\nddd
COMMAND: $! b a
COMMAND: :a
COMMAND: N
PATTERN: aaa\nbbb\nccc\nddd\n
COMMAND: $! b a
COMMAND: s/bbb\nccc\n/g.h"f*$g"fd'd/f#@%q\n&='f\g\\//=?+[]{|()^`n`$r`a\d,\s\w\t\r\p{xx}f><~b\s\S\w\	W/g
MATCHED REGEX REGISTERS
  regex[0] = 4-12 'bbb
ccc
'
PATTERN: aaa\ng.h"f*$g"fd'd/f#@%q\\n&='f\\g\\\\//=?+[]{|()^`n`$r`a\\d,\\s\\w\\t\\r\\p{xx}f><~b\\s\\S\\w\\\tWddd\n
END-OF-CYCLE:
aaa
g.h"f*$g"fd'd/f#@%q\n&='f\g\\//=?+[]{|()^`n`$r`a\d,\s\w\t\r\p{xx}f><~b\s\S\w\	Wddd

$ set +x
$ a=$(sed ":a;N;\$!ba;s/${ZeilenAktion1Arrey[i]}/${ZeilenAktion2Arrey[i]}/g" "/etc/environment")
$ echo "$a"
aaa
g.h"f*$g"fd'd/f#@%q\n&='f\g\\//=?+[]{|()^`n`$r`a\d,\s\w\t\r\p{xx}f><~b\s\S\w\	Wddd
$ #--------------------------------------------------------------------------------------
$ ZeilenAktion1Arrey[i]="bbb\nccc"
$ a=$(sed ":a;N;\$!ba;s/${ZeilenAktion1Arrey[i]}/${ZeilenAktion2Arrey[i]}/g" "/etc/environment")
$ echo "$a"
aaa
g.h"f*$g"fd'd/f#@%q\n&='f\g\\//=?+[]{|()^`n`$r`a\d,\s\w\t\r\p{xx}f><~b\s\S\w\	W
ddd
$ 

Am Ende wird "Wddd\n" ausgegeben, da das "\n" Zeichen ja ersetzt werden soll. Aus diesem Grund wurde das "\n" am Ende der Definition von ZeilenAktion1Arrey[i] entfernt und man erhält das gewünschte Ergebnis.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Vielen Dank.

Antworten |