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