正则表达式 - 编辑文本文件中的 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')
..注释掉 source
和 md5sums
中的最后一项并关闭数组 ()
).
我只知道如何做 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;N
和 2
将是行数减一
我想更改以下部分:
# 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')
..注释掉 source
和 md5sums
中的最后一项并关闭数组 ()
).
我只知道如何做 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;N
和 2
将是行数减一