如何删除bash中的字符后的所有文本?
一个例子可能是有益的,但如果我理解正确的话,这会工作:
cut -f1 -d":"
这将转换成“你好:世界”到“你好”。
egrep -o '^[^:]*:'
你能解释一下怎么解释这个,谢谢。 – 2016-12-28 06:46:07
'egrep'是'-E'的grep。这与普通的'grep'没有什么不同。 '-o'指示grep仅打印与表达式匹配的行的部分。 '^'将匹配锚定到一行的开头。 '[^:] *'匹配零个或多个不是':'字符的字符。 ':'匹配字符':'。 – cdhowie 2016-12-29 16:16:59
再次感谢 – 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
这是本机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
@denniswilliamson如何删除2个字符在'hello:world'这样的特定字符串通过'$ {a%:*}'变成'hello:wo'后? – 3kstc 2016-06-25 13:05:59
很好的答案,非常感谢,但是为了只获取'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"/"
结果在另一些情况下,最后案件也可能有所帮助。请注意,在上次输出开始时没有“/”。
'cut'作品的解释,但丹尼斯的回答更好,更灵活。有没有人知道它是否会产生像'cut'这样的新过程? – JoBu1324 2014-02-20 18:06:18
最好使用Bash的内置参数扩展功能,而不是生成运行诸如'basename'和'cut'之类的工具的子壳体,参见Dennis的答案 – 2016-06-14 17:32:54
'cut'可以从标准输入读取,所以它更好,尤其是当你有很长的时间需要处理的字符串,如文件的内容。 – Sahas 2017-04-26 08:34:30