如何删除bash中的字符后的所有文本?

问题描述:

如何在bash中删除一个字符(本例中为冒号(“:”))后的所有文本?我也可以取出结肠吗?我不知道如何。如何删除bash中的字符后的所有文本?

一个例子可能是有益的,但如果我理解正确的话,这会工作:

cut -f1 -d":" 

这将转换成“你好:世界”到“你好”。

+4

'cut'作品的解释,但丹尼斯的回答更好,更灵活。有没有人知道它是否会产生像'cut'这样的新过程? – JoBu1324 2014-02-20 18:06:18

+2

最好使用Bash的内置参数扩展功能,而不是生成运行诸如'basename'和'cut'之类的工具的子壳体,参见Dennis的答案 – 2016-06-14 17:32:54

+0

'cut'可以从标准输入读取,所以它更好,尤其是当你有很长的时间需要处理的字符串,如文件的内容。 – Sahas 2017-04-26 08:34:30

egrep -o '^[^:]*:' 
+0

你能解释一下怎么解释这个,谢谢。 – 2016-12-28 06:46:07

+1

'egrep'是'-E'的grep。这与普通的'grep'没有什么不同。 '-o'指示grep仅打印与表达式匹配的行的部分。 '^'将匹配锚定到一行的开头。 '[^:] *'匹配零个或多个不是':'字符的字符。 ':'匹配字符':'。 – cdhowie 2016-12-29 16:16:59

+0

再次感谢 – 2016-12-30 02:35:08

在Bash(和ksh,zsh,破折号等)中,可以使用参数扩展%这将从字符串末尾或#删除字符,这将从字符串的开头删除字符。如果您使用这些字符中的单个字符,则最小的匹配字符串将被删除。如果你将角色翻倍,最长的将被删除。

$ a='hello:world' 
$ b=${a%:*} 
$ echo "$b" 
hello 
$ a='hello:world:of:tomorrow' 
$ echo "${a%:*}" 
hello:world:of 
$ echo "${a%%:*}" 
hello 
$ echo "${a#*:}" 
world:of:tomorrow 
$ echo "${a##*:}" 
tomorrow 
+3

这是本机shell的字符串操作,所以不会产生额外的进程。参考[Bash参数替换](http://tldp.org/LDP/abs/html/parameter-substitution.html#PARAMSUBREF),[Bash String Manipulation](http://tldp.org/LDP/abs/html/ string-manipulation.html)和[Better Bash Scripting](http://robertmuth.blogspot.jp/2012/08/better-bash-scripting-in-15-minutes.html) – 2014-04-14 03:13:04

+0

@denniswilliamson如何删除2个字符在'hello:world'这样的特定字符串通过'$ {a%:*}'变成'hello:wo'后? – 3kstc 2016-06-25 13:05:59

+0

很好的答案,非常感谢,但是为了只获取'tomorrow',我们还会添加''$ {a ## *:}''= – avtomaton 2016-11-28 01:40:23

$ echo 'hello:world:again' |sed 's/:.*//' 
hello 

比方说你有一个路径,在此格式的文件:

/dirA/dirB/dirC/filename.file 

现在你只需要其中包括四个“/”的路径。键入

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/" 

和你的输出就会

/dirA/dirB/dirC 

使用切口的优点是,你还可以切出uppest目录以及文件(在这个例子中),因此,如果您键入

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/" 

你的输出将

/dirA/dirB 

虽然你可以从字符串的另一侧做同样的,它不会做出太大的意义在这种情况下,在

dirA/dirB/dirC 

打字

$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/" 

结果在另一些情况下,最后案件也可能有所帮助。请注意,在上次输出开始时没有“/”。