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

时间:2010-11-12 19:34:29

标签: bash

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

6 个答案:

答案 0 :(得分:215)

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

$ 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

答案 1 :(得分:114)

一个例子可能有用,但如果我理解正确,这将有效:

echo "Hello: world" | cut -f1 -d":"

这会将“hello:world”转换为“hello”。

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

假设您有一个包含此格式文件的路径:

/dirA/dirB/dirC/filename.file

现在你只需要包含四个“/”的路径。型

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

,您的输出将是

/dirA/dirB/dirC

使用剪切的优点是你还可以剪切最上面的目录以及文件(在本例中),所以如果你输入

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

您的输出将是

/dirA/dirB

虽然你可以从字符串的另一边做同样的事情,但在这种情况下输入

并没有多大意义
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"

结果

dirA/dirB/dirC

在其他一些情况下,最后一种情况也可能有所帮助。请注意,在最后一个输出的开头没有“/”。

答案 5 :(得分:-1)

删除“:”最后一个实例之后的所有内容

cat fileListingPathsAndFiles.txt | grep -o '^.*:'

,如果您想删除最后一个“:”

cat file.txt | grep -o '^.*:' | sed 's/:$//'

@ kp123:您想将:替换为/(sed冒号应为\/