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

如何删除bash中字符后的所有文本?,bash,Bash,在bash中,如何删除字符后的所有文本,在本例中是冒号(“:”)?我也可以去掉结肠吗?我不知道该怎么做 一个例子可能很有用,但如果我理解正确,这就行了: egrep -o '^[^:]*:' echo "Hello: world" | cut -f1 -d":" 这将在Bash(以及ksh、zsh、dash等)中将Hello:world转换为Hello,您可以使用%进行参数扩展,该扩展将删除字符串末尾的字符,或#将删除字符串开头的字符。如果使用这些字符

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

一个例子可能很有用,但如果我理解正确,这就行了:

egrep -o '^[^:]*:'
echo "Hello: world" | cut -f1 -d":"
这将在Bash(以及ksh、zsh、dash等)中将
Hello:world
转换为
Hello

,您可以使用
%
进行参数扩展,该扩展将删除字符串末尾的字符,或
#
将删除字符串开头的字符。如果使用这些字符中的单个字符,则将删除最小的匹配字符串。如果将字符加倍,则将删除最长的字符

$ 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

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

/dirA/dirB/dirC/filename.file
现在您只需要包含四个“/”的路径。类型

您的输出将是

/dirA/dirB/dirC
使用cut的优点是,您还可以剪切uppest目录和文件(在本例中),因此如果您键入

$ 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

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

在最后一个实例“:”之后修剪所有内容

如果你想放弃最后一个“:”


@kp123:您可能希望将
替换为
/
(sed冒号应该位于
\/

cut
有效,但丹尼斯的答案更好、更灵活。有人知道它是否会产生一个新的进程,比如
cut
?使用Bash的内置参数扩展功能比生成运行工具的子shell更好,比如
basename
cut
,参见下面的Dennis回答
cut
可以从stdin中读取,因此,它更好,尤其是当您需要处理一个很长的字符串时,比如文件的内容。这将如何应用于
hello:world
。这是半个答案。也可以使用类似于{var/:/''}的替代语法来完成,但只在bash中工作。这是本机shell字符串操作,因此不会产生额外的进程。参考,和@denniswilliamson我怎么能删除一个特定字符串后的2个字符,比如
hello:world
将通过使用
${a%:*}
,变成
hello:wo
?回答得很好,非常感谢,但也可以添加
“${a%:*:}”
只获取
明天
=)@opencivilization:您可能需要使用正则表达式匹配:
a='hello:world:of:tomory';模式='''^([^::]*:).*$'
;[$a=~$pattern]];回音“${BASH_REMATCH[1]}”`。仅当存在冒号时才匹配。如果您希望它是可选的,则必须使用不同的模式。对Bash正则表达式(以及一般正则表达式)的解释超出了这些注释的范围。您可以找到其他讨论此问题的问题,也可以发布自己的问题。@kp123:这是我回答的第一个示例。我第二次展示它时(删除了“明天”),它几乎正是你要问的情况。你能解释一下如何解释这一点吗,谢谢。
egrep
是grep with
-E
。它与常规的
grep
没有区别
-o
指示grep仅打印与表达式匹配的行部分<代码>^
将匹配锚定到行首<代码>[^::]*匹配零个或多个非
字符的字符
匹配字符
。如果您有一个目录“/resources/views/admin/users/relationships/posts.blade.php”,并且您不知道字符串中有多少个“/”字符,则希望截断最后一次出现“/”之后的所有内容。因此,这里我希望输出为“/resources/views/admin/users/relationships/”(甚至是不带尾随斜杠的/resources/views/admin/users/relationships/)。你会怎么做?一岁多;有一个命令:Dirname是唯一正确的答案。由于此答案在给定特定字符后删除,其他答案也会删除该字符。
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
dirA/dirB/dirC
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
cat file.txt | grep -o '^.*:' | sed 's/:$//'