如何使用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
答案 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
。
您还可以使用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
反转该行,以便我们可以从第二个-
开始。最后,我们反向回到初始格式。
通过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)