Bash 将行内容打印到特定字符

Bash 将行内容打印到特定字符,bash,perl,shell,awk,sed,Bash,Perl,Shell,Awk,Sed,如何使用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-L

如何使用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中的字段数。如果你有一个-,这就行了。否则,行格式将起作用-将转换为空间。为此,您需要说awk-F--vofs=-'NF-'文件

您还可以使用rev和cut:

rev将线反转,这样我们就可以从第二个开始。最后,我们反向返回以获得初始格式

通过python3:

fileinput.input从标准输入获取输入。对于f中的行:迭代每一行,然后根据-将拆分的项与-作为分隔符进行拆分,并通过排除最后拆分的项将其合并

使用bash:

和格雷普

grep -oP '.*(?=-)' file
使用perl

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

另请参见@G.Cito

使用隐式while{}循环,并说出匹配项:

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

看。

你从邮局得到什么了吗?sed的/\.*-.*/\1/”源于@jimmiji的帖子。啊,我不知何故首先想到了@fedorqui,python呢?我认为大多数linux发行版都预装了python。@AvinashRaj您缺少Ruby、c、Java和Haskell:-D我对python的经验不足,所以我想我会通过添加这种方法来降低答案的质量。@AvinashRaj我非常高兴向您学习,所以请继续!标识在python中非常重要。fileinput.input从标准输入获取输入。对于f中的行:迭代每一行,然后根据分隔符分割行,然后通过排除最后分割的项将分割的项与分隔符连接起来。+但是perl可以缩短,因为它只打印匹配项:-@G.Cito,你是说perl-nE'say/*-/'?是的,我发布了它;-哟!+很抱歉,我在看到您的答案之前发表了评论:-
Kernel release..............2.6.18-194.26.1.el5
Master disk release.........swp-RedHat-Linux-OS-5.5.0.0
grep -oP '.*(?=-)' file
perl -nE '/(.*)-/ and say $1' file
perl -nE 'say /(.*)-/' kernelverstion-data.txt