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

mai*_*ash 0 bash shell perl 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
Run Code Online (Sandbox Code Playgroud)

请求的输出是:

Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 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
Run Code Online (Sandbox Code Playgroud)

这将找到最后一个-后跟任意数量的非-字符,直到行尾.然后,它用空字符串替换它们,以便删除它们.

虽然惯用的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
Run Code Online (Sandbox Code Playgroud)

这将字段分隔符设置为-和减少字段数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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

fileinput.input()从标准输入获取输入.for line in f:迭代每一行然后根据分割该行-,然后-通过排除最后一个分割项目将分割的项目作为分隔符连接. 归功于Avinash Raj!