打印直到特定字符的行的内容

时间:2015-03-03 14:27:12

标签: bash perl shell awk sed

如何使用sed或awk或perl one liners打印直到特定最后字符-的行:

鉴于此输入:

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

4 个答案:

答案 0 :(得分:11)

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中的字段数。只有你有一个-时才有用。否则,行格式将起作用(-将转换为空格。为此,您需要说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反转该行,以便我们可以从第二个-开始。最后,我们反向回到初始格式。

通过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:遍历每一行,然后根据-拆分行,然后通过排除最后一个拆分项,将-作为分隔符加入拆分项。 {{ 3}}

答案 1 :(得分:4)

使用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

答案 2 :(得分:2)

使用grep

grep -oP '.*(?=-)' file

使用perl

perl -nE '/(.*)-/ and say $1' file

另见@ G.Cito

答案 3 :(得分:2)

循环使用隐式while(){}say匹配的内容:

perl -nE 'say /(.*)-/' kernelverstion-data.txt

请参阅perlrun