打印特定字符的行内容

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

你也可以玩 revcut:

$ 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