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

时间:2017-05-10 08:56:42

标签: regex sed gnu

我想更改以下内容:

# 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,并用{<1}}注释掉:

'linux-4.11.patch')

Sed版本:

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

1 个答案:

答案 0 :(得分:1)

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

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


如果已知行数是固定数,

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

其中N;N2将是行数减去一个