如何删除特定字符后的string中的所有内容?

例:

before: text_before_specific_character(specific_character)text_to_be_deleted after: text_before_specific_character 

我知道这可以用'sed'来完成。 但我卡住了。 有人可以帮我吗?

没有理由使用像sed这样的外部工具。 bash可以在内部完成, 使用参数扩展 :

如果您要修剪的字符是: ,例如:

 $ str=foo_bar:baz $ echo "${str%%:*}" foo_bar 

你可以用贪婪和非贪婪的方式做到这一点:

 $ str=foo_bar:baz:qux $ echo "${str%:*}" foo_bar:baz $ echo "${str%%:*}" foo_bar 

特别是如果你在一个严格的循环中调用这个函数,启动一个新的sed进程,写入进程,读取它的输出,等待它退出(以获得它的PID)可能是一个很大的开销, bash不会有。


现在 – 通常,当想要这样做时,你可能真正想要的是将变量分割成字段,这更好地通过read来完成。

例如,假设您正在从/etc/passwd读取一行:

 line=root:x:0:0:root:/root:/bin/bash IFS=: read -r name password_hashed uid gid fullname homedir shell _ <<<"$line" echo "$name" # will emit "root" echo "$shell" # will emit "/bin/bash" 

即使你想处理文件中的多行,也可以单独使用bash来完成,而且不需要外部进程:

 while read -r; do echo "${REPLY%%:*}" done <file 

…将首先发布一切:file每一行,不需要任何外部工具启动。

你要找的东西其实很简单:

 sed 's/A.*//' 

A标记特定的字符。 请注意,它是区分大小写的,如果你想捕捉多个字符使用

 sed 's/[aAbB].*//' 

如果TEXT包含你的文字,如

 TEXT=beforexafter 

那么特定的字符发生(例如)为x

 echo "${TEXT%x*}" 

做你想要的。

对于Bash来说, "$TEXT""${TEXT}"是整个beforexafter ,但之前的"${TEXT%xafter}"就是beforexafter切割结束。 要砍掉x及其后的任何东西,可以写下"${TEXT%x*}"

顺便说一句,还有"${TEXT%%x*}" 。 只有当有多个x才会有所不同。 有了%% ,Bash会截掉所有的x ,而%则只会从最后一个x 。 你可以通过松散地观察,记得更长的%%砍掉更多的文本。

你也可以用Sed来做,当然,如果你愿意:

 echo "$TEXT" | sed 's/x.*//'