bash 中 trim 字符串(去除首尾空格) - grep 去空行

在 bash 下如何去除一个字符串首尾的空格(也就是 trim)呢?其实有一个简单的办法:

$ echo $STR

注 意 $STR 不要带引号。因为 $STR 展开后,会作为 echo 的参数。那么 echo 在处理参数的时候,自然会忽略首尾的空格。不过此种方法有个小问题,那就是 echo 输出的结果,会将字符串中间的连续空格变成一个空格。例如 $STR 为 "   any    string    " 的话,那么输出将是 "any string"。

    既然这种方法有这么个小问题,我就想是否可以用其他办法。最后想到的还是用 grep 来做。如下:

$ echo "$STR" | grep -o "[^ ]\+\( \+[^ ]\+\)*"

用 "[^ ]+( +[^ ]+)*" 去匹配除首尾空格外的部分,然后 -o 仅输出匹配的部分,这样就达到去除首尾空格的效果了。
转自:
http://blogold.chinaunix.net/u/24581/showart_1882388.html
以下相关信息:
常用的 grep 选项有:
-c 只输出匹配行的个数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
-V 显示软件版本信息
使用grep匹配时最好用双引号引起来,防止被系统误认为参数或者特殊命令,也可以匹配多个单词。
例如:
grep -n "^$" test.txt 显示输出空行的行号
<think>首先,用户的问题是:“bash中的字符串切分”,意思是“bash中的字符串切分”。我需要用中文回答这个问题。 我的回答必须包括: 1. 解释bash中的字符串切分。 2. 在回答末尾,必须提供3-5个相关问题,以“§§相关问题§§”开头,并且不能换行分散。 回顾规则: - 回答完问题后,必须提出3-5个相关问题。 - 第一行必须是“§§相关问题§§”,完整输出。 - 禁止换行分散,意思是相关问题应该在一行或连续输出,不能有额外的换行。 示例格式: - 回答后,直接输出“§§相关问题§§”,然后列出问题,用数字标记,如1. ··· 2. ··· 3. ··· 现在,关于主题:bash中的字符串切分。 -bash中,字符串切分通常涉及使用参数扩展来提取子字符串- 常见的方法包括: - `${var:start:length}`:从位置start开始,提取length长度的子字符串- `${var#pattern}`:删除最短匹配pattern的前缀。 - `${var##pattern}`:删除最长匹配pattern的前缀。 - `${var%pattern}`:删除最短匹配pattern的后缀。 - `${var%%pattern}`:删除最长匹配pattern的后缀。 - 我应该用中文解释这些。 结构我的回答: 1. 简要介绍bash中的字符串切分。 2. 提供一些例子,用代码块展示。 3. 结束回答。 4. 然后输出“§§相关问题§§”,并列出3-5个相关问题。 相关问题应该基于用户的问题和我的回答。例如: - 如何提取字符串的一部分? - 如何删除前缀或后缀? - 是否有其他方法在bash中处理字符串- 切分字符串时如何处理空格- 等等。 列出可能的3-5个相关问题: 1. 如何在bash中提取字符串的子字符串? 2. 如何使用模式匹配来删除字符串的前缀或后缀? 3. 在bash中处理字符串时,如何处理空格和特殊字符? 4. 是否有内置函数或外部工具用于更复杂的字符串操作? 5. 字符串切分在脚本中的常见应用场景有哪些? 确保输出格式: - 回答后,直接输出“§§相关问题§§”,然后在新行列出问题,但规则说“禁止换行分散”,意思可能是问题列表应该紧凑,没有多余换行。在示例中,是“§§相关问题§§”后直接跟问题列表,用数字点分隔。 在示例中: ``` §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 所以,我应该输出“§§相关问题§§”后换行,然后列出问题。 现在,编写回答内容。 首先,解释bash中的字符串切分: -bash中,字符串切分主要通过参数扩展实现。 - 核心语法:`${var:position:length}` 提取子字符串- 其他:`#`, `##`, `%`, `%%` 用于模式匹配。 提供例子: - 例如,`str="hello world"`, 然后 `${str:6:5}` 输出 "world"。 - 或者,`filename="file.txt"`, `${filename%.*}` 输出 "file"。 用代码块展示。 完整回答:</think>在bash脚本中,字符串切分主要通过参数扩展(Parameter Expansion)实现,这是一种高效的内置功能,用于提取、修改或删除字符串的部分内容。核心方法包括: - **子字符串提取**:使用 `${var:start:length}` 语法,其中 `start` 是起始索引(从0开始),`length` 是提取的长度(可选,省略时提取到末尾)。 - **前缀删除**:使用 `${var#pattern}`(删除最短匹配的前缀)或 `${var##pattern}`(删除最长匹配的前缀)。 - **后缀删除**:使用 `${var%pattern}`(删除最短匹配的后缀)或 `${var%%pattern}`(删除最长匹配的后缀)。 ### 示例代码 以下是一些常见操作的bash示例: ```bash # 示例字符串 str="hello_world.txt" # 提取子字符串:从索引6开始提取5个字符 echo "${str:6:5}" # 输出 "world" # 删除后缀:移除最短匹配的 ".txt" echo "${str%.*}" # 输出 "hello_world" # 删除前缀:移除最短匹配的 "hello_" echo "${str#*_}" # 输出 "world.txt" # 删除最长匹配的后缀:移除所有以 "." 开头的部分 echo "${str%%.*}" # 输出 "hello" ``` 注意事项: - 索引从0开始,负数索引表示从末尾计算(例如 `${str: -5}` 提取最后5个字符)。 - 模式支持通配符(如 `*` 匹配任意字符),但需注意特殊字符需转义。 - 在脚本中,这些操作不会修改原变量,除非重新赋值(如 `str="${str#pattern}"`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值