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

例:

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.*//'

相关文章

本文从从Bitcask存储模型讲起,谈轻量级KV系统设计与实现。从...
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确...
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的...
本文介绍如何离线生成sst并在线加载,提供一种用rocksdb建立...
验证用户输入是否正确是我们应用程序中的常见功能。Spring提...
引入pdf2dom &lt;dependency&gt; &lt;groupId&a...