例:
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}"
就是before
的xafter
切割结束。 要砍掉x
及其后的任何东西,可以写下"${TEXT%x*}"
。
顺便说一句,还有"${TEXT%%x*}"
。 只有当有多个x
才会有所不同。 有了%%
,Bash会截掉所有的x
,而%
则只会从最后一个x
。 你可以通过松散地观察,记得更长的%%
砍掉更多的文本。
你也可以用Sed来做,当然,如果你愿意:
echo "$TEXT" | sed 's/x.*//'