例:
before: text_before_specific_character(specific_character)text_to_be_deleted
after: text_before_specific_character
Run Code Online (Sandbox Code Playgroud)
我知道可以用'sed'完成.但我被卡住了.有人可以帮我吗?
Cha*_*ffy 27
为此,没有理由使用sed等外部工具; bash可以使用参数扩展在内部完成:
如果您要修剪的角色是:
,例如:
$ str=foo_bar:baz
$ echo "${str%%:*}"
foo_bar
Run Code Online (Sandbox Code Playgroud)
你可以用贪婪和非贪婪的方式做到这一点:
$ str=foo_bar:baz:qux
$ echo "${str%:*}"
foo_bar:baz
$ echo "${str%%:*}"
foo_bar
Run Code Online (Sandbox Code Playgroud)
特别是如果你在一个紧密的循环中调用它,启动一个新的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"
Run Code Online (Sandbox Code Playgroud)
即使您想要处理文件中的多行,也可以单独使用bash并且无需外部进程:
while read -r; do
echo "${REPLY%%:*}"
done <file
Run Code Online (Sandbox Code Playgroud)
... :
将从每一行发射所有内容file
,而不需要任何外部工具.
Nit*_*Nit 10
您正在寻找的实际上非常简单:
sed 's/A.*//'
Run Code Online (Sandbox Code Playgroud)
凡A
标志着特定的字符.请注意,如果要捕获多个字符,则区分大小写
sed 's/[aAbB].*//'
Run Code Online (Sandbox Code Playgroud)