打印特定字符的行内容
Print contents of lines up to a specific character
如何打印直到特定 last 字符 -
的行,使用 sed 或 awk 或 perl 一行:
鉴于此输入:
Kernel release..............2.6.18-194.26.1.el5-PAE
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0-03
请求的输出是:
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
sed
做的相当快:
$ sed 's/-[^-]*$//' file
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
这会找到最后一个 -
,后跟任意数量的非 -
字符,直到行尾。然后,它将它们替换为空字符串,以便将它们删除。
尽管惯用的 awk
解决方案也不错:
$ awk -F- 'NF--' file
Kernel release..............2.6.18 194.26.1.el5
Master disk release.........swp RedHat Linux OS 5.5.0.0
这会将字段分隔符设置为 -
并减少 1
中的字段数。如果你有一个 -
,这就有效。否则,行格式将起作用(-
将转换为 space。为此,您需要说 awk -F- -v OFS=- 'NF--' file
。
你也可以玩 rev
和 cut
:
$ rev file | cut -d- -f2- | rev
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
rev
将线反转,这样我们就可以从第2个-
上得到了。最后,我们反向返回初始格式。
通过python3
:
$ python3 -c 'import fileinput
with fileinput.input() as f:
for line in f:
print("-".join(line.split("-")[:-1]))' file
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
fileinput.input()
从标准输入获取输入。 for line in f:
遍历每一行,然后根据 -
拆分行,然后通过排除最后拆分的项目,以 -
作为分隔符连接拆分的项目。
与bash
:
while read; do echo "${REPLY%-*}"; done < infile
输出:
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
使用 grep
grep -oP '.*(?=-)' file
使用 perl
perl -nE '/(.*)-/ and say ' file
另见@G.Cito
循环使用隐式 while(){}
和 say
匹配的内容:
perl -nE 'say /(.*)-/' kernelverstion-data.txt
参见 perlrun
。
如何打印直到特定 last 字符 -
的行,使用 sed 或 awk 或 perl 一行:
鉴于此输入:
Kernel release..............2.6.18-194.26.1.el5-PAE
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0-03
请求的输出是:
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
sed
做的相当快:
$ sed 's/-[^-]*$//' file
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
这会找到最后一个 -
,后跟任意数量的非 -
字符,直到行尾。然后,它将它们替换为空字符串,以便将它们删除。
尽管惯用的 awk
解决方案也不错:
$ awk -F- 'NF--' file
Kernel release..............2.6.18 194.26.1.el5
Master disk release.........swp RedHat Linux OS 5.5.0.0
这会将字段分隔符设置为 -
并减少 1
中的字段数。如果你有一个 -
,这就有效。否则,行格式将起作用(-
将转换为 space。为此,您需要说 awk -F- -v OFS=- 'NF--' file
。
你也可以玩 rev
和 cut
:
$ rev file | cut -d- -f2- | rev
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
rev
将线反转,这样我们就可以从第2个-
上得到了。最后,我们反向返回初始格式。
通过python3
:
$ python3 -c 'import fileinput
with fileinput.input() as f:
for line in f:
print("-".join(line.split("-")[:-1]))' file
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
fileinput.input()
从标准输入获取输入。 for line in f:
遍历每一行,然后根据 -
拆分行,然后通过排除最后拆分的项目,以 -
作为分隔符连接拆分的项目。
与bash
:
while read; do echo "${REPLY%-*}"; done < infile
输出:
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
使用 grep
grep -oP '.*(?=-)' file
使用 perl
perl -nE '/(.*)-/ and say ' file
另见@G.Cito
循环使用隐式 while(){}
和 say
匹配的内容:
perl -nE 'say /(.*)-/' kernelverstion-data.txt
参见 perlrun
。