例:
before: text_before_specific_character(specific_character)text_to_be_deleted after: text_before_specific_character
我知道这可以用'sed'来完成。 但我卡住了。 有人可以帮我吗?
检查bash中的空string
当我sudo bash -c会发生什么?
Sudo – 等待孩子,并获得孩子的PID
你如何给su当前的用户环境variables
移动一个未知名称的文件
没有理由使用像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.*//'