如何去掉行首行尾的空格

更多干货参见本人技术博客:https://blog.zhenglin.work

通过sed替换方法去掉行首或行尾的空格

$ echo   -e  "Hello  Word    "  | sed 's#\s*##;s#\s*$##'
Hello  Word
  • #可以与/互换,避免混淆这里统一用#来表示分隔符
  • \s匹配任何空白字符,包括空格、制表符、换页符等等,等价于[ \f\n\r\t\v]
  • \S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]

其他方法

在GitHub浏览代码时,发现https://github.com/dylanaraps/pure-bash-bible一个特别好的bash代码应用实例,上面截取字符串方法如下:

  • 去掉行首和行尾的空格
trim_string() {# Usage: trim_string "   example   string    ": "${1#"${1%%[![:space:]]*}"}": "${_%"${_##*[![:space:]]}"}"printf '%s\n' "$_"
}

结果:

$ trim_string "    Hello,  World    "
Hello,  World

代码写的很简洁,注释太少;这里做一下注解 ,方便自己理解和以后使用,可以给大家提供一个参考

  • 首先看方法体格式

method(){: 参数1: 参数2}

它里面有注解:The : built-in is used in place of a temporary variable. 用内置函数冒号替代临时变量 ;和${parameter:word} 这种用法类似,把处理后得到的值存储到冒号中了; 这种格式方法,值得借鉴。

  • “$_” 是保存之前执行命令 最后一个参数
  • 字符串截取可以参考 https://www.cnblogs.com/xwdreamer/p/3823463.html
  • 这是假设一个字符串为: “两个空格Hello空格Word三个空格”,开头的两个空格命名为A;结尾三个空格命名为B;即“AHello WordB”
  • 字符串截取知识掌握后,再来逐步分析${1#"${1%%[![:space:]]*}"} 作用 ,这种层层取值变量,都是先计算最内部的值(如果是=赋值都是先算右边),然后再算外层的;${1%%[![:space:]]*},${1}是变量,’%%[![:space:]]*’ 个是从右往左进行截取,直到截取值为最后几个空格(把最后一个非空格都截掉了就剩开头两个空格即A了) ;然后’${1#A}’,再次字符串截取,相当于只截取掉A(开头两个空格),得到“Hello WordB”
  • '${%"${##[![:space:]]}"}’,’${_}‘表示存储之前操作后得到的变量;’${_##[![:space:]]}‘从左往右截取,所有非空格都截取掉,只保留最后几个空格即B(结尾的三个空格),然后变为’${_%B}'这个就是把结尾处B(三个空格)截取掉。

发散与扩展

[![:space:]]能不能像sed中用到的正则换成\S,尝试了一次,没有成功,然后又替换成[^ \f\n\r\t\v] 这种非简写的格式,最后也可以实现这个效果;printf 格式输出换成echo也可以 。

trim_stringw() {# Usage: trim_string2 "   example   string    ": "${1#"${1%%[^ \f\n\r\t\v]*}"}": "${_%"${_##*[^ \f\n\r\t\v]}"}"echo  "$_"
}

但是如果换成(无法实现效果):

trim_stringb() {# Usage: trim_string "   example   string    ": "${1#[[:space:]]*}": "${_%*[[:space:]]}"printf '%s\n' "$_"
}

就实现不了这个效果;

去掉所有多余空格,中间的空格只保留一个空格

trim_all() {# Usage: trim_all "   example   string    "set -fset -- $*printf '%s\n' "$*"set +f
}

这个方法比较好理解,通过set – $* 去掉了多余的空格,每个参数间只保留一个空格,set -f /+f 取消/增加通配符使用后,方便格式化;所以上面方法可以写成:

trim_all() {set -- "$@"  #或set -- "$*"echo "$@"  #或echo "$*"
}

如果用$@的话,用引号包起来,表示一个字符串整体,$*用不用引号包起来都表示一个字符串。

更新更详细的博客,见博主官网:
https://blog.zhenglin.work

如何去掉行首行尾的空格相关推荐

  1. Atom编辑Markdown文件保存后行尾的空格自动消失的问题解决

    Markdown文件的行尾增加两个空格表示一行结束需要换行. 但保存文件后,行尾的空格自动消失,导致不换行. 解决方法: 1.[Edit]->[Preferences]->[Package ...

  2. sublime多行变一行及sublime一键格式化html/css/js、光标快捷键移动行首行尾、删除空行

    一.sublime多行变一行 1. Ctrl+Shift+L 先选中多行,再按下快捷键,会在每行行尾插入光标,即可同时编辑这些行. 2.按Del键,删掉 \n 注: https://www.thinb ...

  3. Vim 批量在行首/行尾插入相同字符

    0. 需求说明 有时候,我们会有这样的需求,在一个多行的文本中,需要在行首,或者行尾,插入相同的字符.这个时候,使用 Vim 的 `ctrl + v` 来批量选中,再配合`^$IA`等命令,就非常好处 ...

  4. 用正则表达式去除行首行尾空格

    2019独角兽企业重金招聘Python工程师标准>>> 用 Notepad++ 打开,把每一个将要放在表中单元格的内容放一行(注: ^ 代表行首 $ 代表行尾) 去除行尾空格和空白行 ...

  5. 问题 D: 去行首行尾的空白符

    题目描述 在C语言中,将ASCII字符集中的制表符('\t').回车符('\r').换行符('\n').垂直制表符('\v').换页符('\f')和空格字符(' ')称作空白符. 你的任务是读入每行字 ...

  6. EditPlus行首行尾批量添加字符 以及其它常用正则

    打开EditPlus,输入多行数据,快捷键ctrl+h 打开替换窗口,选择"正则表达式"替换 行首批量添加   查找"^" 替换为"我是行首aaa&q ...

  7. linux vim 终端 行首 行尾_不会vi/vim,看这一篇足矣

    今日分享:Don't allow your rituals to become ruts. -- Todd Henry ❞ vi/vim 的重要性不言而喻,比如登录服务器操作.那么如何掌握呢?看这一篇 ...

  8. linux vim 终端 行首 行尾_vim总结

    图片来源:https://www.runoob.com/linux/linux-vim.html 插入 o 换行插入 O在上一行插入一行 i 插入 I在行首插入 a 追加插入 A在行尾插入 切换到正常 ...

  9. Sublime text3!行首,行尾,批量编辑!

    1.Windows下的操作操作步骤 1.Ctrl + H 2.打开正则,输入^,然后Find All,查找所有的行首 3.打开正则,输入$,然后Find All,查找所有的行尾 4.光标闪动,就可以进 ...

最新文章

  1. 问一下,线程池里面到底该设置多少个线程?
  2. 保护眼睛设置.txt
  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】...
  4. java基础知识讲解(一)数据类型和运算符
  5. GDCM:西门子CSA转DICOM文件的测试程序
  6. Windows下配置R-FCN
  7. java课程设计实验报告_javaweb课程设计实验报告
  8. php post请求 下载文件,POST请求 下载文件
  9. linux共享内存 pmu,如何使用gator/streamline 收集PMU perf event计数
  10. Activity中的setDefaultKeyMode() (转载)
  11. mysql master slave模式,mysql复制(Replication)模式 主从(Master Slave)模式
  12. 频繁默认网关不可用_win7系统默认网关不可用频繁掉线的解决方法
  13. win10 桌面颜色变成灰色
  14. 天龙八部 - 其它 - 属性伤害的计算方法
  15. 102条简短深刻的回答,看完人生豁然开朗
  16. 二级页面全屏html,还是二级网页不能全屏怎么办? 爱问知识人
  17. cmd设置总是置顶_windows 下如何让一个窗口置顶?
  18. 双目视觉---小孔成像原理视差原理
  19. 理想倍频器/分频器对相噪/杂散的影响
  20. Python多进程:超时进程的处理与终止

热门文章

  1. 激活Microsoft Word 2010
  2. 【原生js实现MVVM核心框架】
  3. 《视觉SLAM进阶:从零开始手写VIO》第三讲 基于优化的IMU预积分与视觉信息融合 作业
  4. Tomcat源码解析:启动
  5. 25-陈庆祥-词法分析
  6. 微信小程序的wxml实现复杂运算或者数据处理
  7. 类与对象(一)----什么是类和对象
  8. perl中bless的理解
  9. 02. 交换机的基本配置和管理
  10. 互联网站规划与设计.txt