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


147

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

Answers:


134

举个例子也许有用,但是如果我对你的理解正确的话,那就可以了:

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

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


5
cut可以,但是我丹尼斯的答案更好,更灵活。有谁知道它是否产生了像这样的新进程cut
2014年

3
使用Bash的内置参数扩展功能比生成子外壳运行工具(例如basename和)更好cut,请参见下面的丹尼斯答案
Louis Maddox

1
cut可以从stdin读取,因此最好在需要处理很长的字符串(例如文件内容)的情况下使用。
萨哈斯

1
以及如何应用于hello: world。这是一半的答案。
K-SO的毒性在增加。

也可以使用{var /:/''}之类的替代语法来完成,但是只能在bash中使用
。– Mahesh

264

在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

6
这是本机外壳程序字符串操作,因此不会产生其他进程。参考Bash参数替换Bash字符串操作更好的Bash脚本编写
Dodzi Dzakuma 2014年

@denniswilliamson如何在使用hello:world将变成的特定字符串之后删除2个字符?hello:wo${a%:*}
3kstc

很好的答案,非常感谢,但是也很高兴添加"${a##*:}"仅获得tomorrow=)
avtomaton

1
@openCivilisation:您可能需要使用正则表达式匹配,则:a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a =〜$ pattern]]; 回显“ $ {BASH_REMATCH [1]}”`。仅当有冒号时才匹配。如果希望它是可选的,则必须使用其他模式。Bash正则表达式(和一般正则表达式)的解释超出了这些注释的范围。您可以找到讨论此问题的其他问题或发表您自己的问题。
暂停,直到另行通知。

1
@ kp123:这是我回答的第一个例子。我第二次展示它(删除了“明天”),这几乎就是您要问的情况。
暂停,直到另行通知。


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

你能解释一下如何解释吗,谢谢。
rɑːdʒɑ

1
egrep是grep与-E。这和常规没有区别grep-o指示grep仅打印出与表达式匹配的行部分。 ^将比赛锚定到一行的开头。 [^:]*匹配零个或多个不是该:字符的字符。 :匹配字符:
cdhowie

再次感谢您的解释
rɑːdʒɑ

3

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

/dirA/dirB/dirC/filename.file

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

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

您的输出将是

/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

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


2
如果您有一个目录“ /resources/views/admin/users/relationships/posts.blade.php”,并且您想在最后一次出现“ /”之后截断所有内容,而又不知道有多少个“ /”,该怎么办?字符串中包含“”字符。所以在这里,我希望输出为“ / resources / views / admin / users / relationships /”(甚至是/ resources / views / admin / users / relationships,不带斜杠)。你会怎么做?
kp123 '19

-1

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

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

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

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

@ kp123:您要替换:/(sed冒号应位于\/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.