正则表达式 - 编辑文本文件中的 Bash 个数组

regex - Edit Bash arrays in text 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')

进入:

# 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')

..注释掉 sourcemd5sums 中的最后一项并关闭数组 ()).

我只知道如何做 1/4 并注释掉 'linux-4.11.patch')

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

Sed 版本:

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

假设数组元素中没有 () 个字符并且文件中没有 NUL 字符

$ sed -zE 's/((source|md5sums)=\([^)]*)\n([^)\n]*\))/)\n#/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 将导致一次读取整个文件
  • -E 扩展正则表达式
  • ((source|md5sums)=\([^)]*)\n([^)\n]*\)) 将导致 source=(...)md5sums=(...) 分两部分匹配,后半部分包含最后一行
  • )\n# 按要求替换


如果已知行数是固定的,

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

其中 N;N2 将是行数减一