2017-05-10 2 views
0

Ich mag würde das folgende Stück ändern:regex - Bearbeiten Bash-Arrays in Textdatei

# Source 
source=('10-nvidia-drm-outputclass.conf' 
     '20-nvidia.conf' 
     'linux-4.11.patch') 
source_i686=("http://us.download.nvidia.com/XFree86/Linux-x86/$pkgver/NVIDIA-Linux-x86-$pkgver.run") 
source_x86_64=("http://us.download.nvidia.com/XFree86/Linux-x86_64/$pkgver/$_pkg.run") 
md5sums=('4f5562ee8f3171769e4638b35396c55d' 
     '2640eac092c220073f0668a7aaff61f7' 
     '897d9775dc484ab37934e7b102c5b325') 
md5sums_i686=('8825cec1640739521689bd80121d1425') 
md5sums_x86_64=('0e9590d48703c8baa034b6f0f8bbf1e5') 
[[ $_pkg = NVIDIA-Linux-x86_64-$pkgver ]] && md5sums_x86_64=('1b74150e84fd99cc1207a51b9327112c') 

in:

# Source 
source=('10-nvidia-drm-outputclass.conf' 
     '20-nvidia.conf') 
#  'linux-4.11.patch') 
source_i686=("http://us.download.nvidia.com/XFree86/Linux-x86/$pkgver/NVIDIA-Linux-x86-$pkgver.run") 
source_x86_64=("http://us.download.nvidia.com/XFree86/Linux-x86_64/$pkgver/$_pkg.run") 
md5sums=('4f5562ee8f3171769e4638b35396c55d' 
     '2640eac092c220073f0668a7aaff61f7') 
#   '897d9775dc484ab37934e7b102c5b325') 
md5sums_i686=('8825cec1640739521689bd80121d1425') 
md5sums_x86_64=('0e9590d48703c8baa034b6f0f8bbf1e5') 
[[ $_pkg = NVIDIA-Linux-x86_64-$pkgver ]] && md5sums_x86_64=('1b74150e84fd99cc1207a51b9327112c') 

..um in source den letzten Eintrag kommentieren und md5sums und in der Nähe die Arrays ()).

Ich weiß nur, wie 1/4 zu tun und die 'linux-4.11.patch') mit Kommentar aus:

sed "/'linux-.*patch'/s/^/#/" 

Sed Version:

$ sed --version | head -1 
sed (GNU sed) 4.4 
+0

haben sie immer 3 Einträge haben? kann es innerhalb der Array-Elemente '(' '' '' '' '' '' '' '' '' '' '' '} Was ist deine Sed Version, hat sie die Option -z? – Sundeep

+0

@Sundeep "Haben sie immer 3 Einträge?" "Wenn es viel einfacher ist, kann ich damit fortfahren. "" Kann es (und) Zeichen innerhalb der Array-Elemente geben? "" Das ist nicht Bash? '" Was ist deine Sed Version, hat sie die Option -z? "' GNU sed 4.4, yes. – Det

+0

Ich meine Array-Einträge wie '20-nvidia.conf' kann es auch so etwas wie' (20) -nvidia.conf' sein? – Sundeep

Antwort

1

Unter der Annahme, keine () Zeichen innerhalb der Array-Elemente und keine NUL-Zeichen in Datei

$ sed -zE 's/((source|md5sums)=\([^)]*)\n([^)\n]*\))/\1)\n#\3/g' input_file 
# Source 
source=('10-nvidia-drm-outputclass.conf' 
     '20-nvidia.conf') 
#  'linux-4.11.patch') 
source_i686=("http://us.download.nvidia.com/XFree86/Linux-x86/$pkgver/NVIDIA-Linux-x86-$pkgver.run") 
source_x86_64=("http://us.download.nvidia.com/XFree86/Linux-x86_64/$pkgver/$_pkg.run") 
md5sums=('4f5562ee8f3171769e4638b35396c55d' 
     '2640eac092c220073f0668a7aaff61f7') 
#   '897d9775dc484ab37934e7b102c5b325') 
md5sums_i686=('8825cec1640739521689bd80121d1425') 
md5sums_x86_64=('0e9590d48703c8baa034b6f0f8bbf1e5') 
[[ $_pkg = NVIDIA-Linux-x86_64-$pkgver ]] && md5sums_x86_64=('1b74150e84fd99cc1207a51b9327112c') 
  • -z verursacht gesamte Datei auf einmal gelesen werden
  • -E erweiterten regulären Ausdruck
  • ((source|md5sums)=\([^)]*)\n([^)\n]*\)) verursacht source=(...) oder md5sums=(...) Spiel in zwei Hälften, mit der zweiten Hälfte letzten Zeile mit
  • \1)\n#\3 je nach Anforderung ersetzen


Wenn die Anzahl der Zeilen als feste Nummer bekannt ist,

sed '/^source=\|^md5sums=/ {N;N; s/\n/)\n#/2}' input_file 

wo N;N und 2 wird Anzahl der Zeilen minus eins

+0

Funktioniert gut :-). – Det

Verwandte Themen