我有一个包含项目的文件,每行一个。该项目至少包含一个短划线,我想删除最后一个短划线和后面的单词。例如:
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?
答案 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
递减字段值的数量,这样我们就不会得到最后一个字段。
1
:awk
适用于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
并用之前的内容替换整行。