sed:替换最后一次出现的" - "到EOL

时间:2017-11-12 17:01:46

标签: regex sed

我的问题

我有一个包含项目的文件,每行一个。该项目至少包含一个短划线,我想删除最后一个短划线和后面的单词。例如:

item asdkalqndla-asdnkfsv-324we-blueray
item asda-vbght564e-dfg-redapple
item gefdsc-fgy-543-5trr-floatingvanilla

应该给:

item asdkalqndla-asdnkfsv-324we
item asda-vbght564e-dfg
item gefdsc-fgy-543-5trr

我尝试了什么

sed 's/\-.*$//' lines.txt

哪个给出了

item asdkalqndla
item asda
item gefdsc

因为正则表达式是贪婪的,并且从第一次破折号开始消耗所有内容。

我的问题

如何删除字符串中最后一个-的所有字符,直到EOL?

4 个答案:

答案 0 :(得分:3)

使用$permissions = ['email','user_birthday']; // Optional permissions $loginUrl = $helper->getLoginUrl('https://example.com/fb-callback.php', $permissions);

awk

答案 1 :(得分:2)

使用^\-的简单否定解决了问题:

$ sed 's/\-[^\-]*$//' lines.txt
item asdkalqndla-asdnkfsv-324we
item asda-vbght564e-dfg
item gefdsc-fgy-543-5trr

这样一来,sed会替换一个破折号,后跟任何东西,但是破折号直到行尾。

答案 2 :(得分:2)

以下简单的awk可能对您有帮助。

awk -F"-" 'NF{NF=(NF-1)} 1' OFS="-"   Input_file

输出如下。

item asdkalqndla-asdnkfsv-324we
item asda-vbght564e-dfg
item gefdsc-fgy-543-5trr

<强> 说明: -F"-":为Input_file的每一行创建-字段分隔符。

NF{NF=(NF-1)}awk开箱即用NF变量,其中包含任意行的字段数,因为我们在最后一次出现-后没有发短信字段分隔符为-,提及NF,我们正在检查某行是否为空。使用1递减字段值的数量,这样我们就不会得到最后一个字段。

1awk适用于condition然后action的方法,因此通过在此处提及1而不在此处提及任何操作来使条件部分为TRUE,因此默认打印为当前行将会发生。

OFS="-":将OFS输出字段分隔符设为"-",以便输出-

编辑: 递减NF的缩短版本如下。

awk -F"-" 'NF{NF-=1} 1' OFS="-"  Input_file

OR

awk -F"-" 'NF{NF--} 1' OFS="-"  Input_file

答案 3 :(得分:1)

这可能适合你(GNU sed):

import sys
import time

def print_slow(str):
    for letter in str:
        sys.stdout.write(letter)
        sys.stdout.flush()  # Force writing to screen even though newline has not been reached.
        time.sleep(.04)

print_slow("Do you wish to begin? (Y/n)")
answer = raw_input()

使用贪婪找到最后一个sed 's/\(.*\)-.*/\1/' file 并用之前的内容替换整行。