linux_sed/grep 匹配不起作用/CRLF导致shell脚本无法正常运行_linux cat有输出 grep无输出-程序员宅基地

技术标签: linux  windows  

sed 文档

linux grep/sed 匹配不起作用

  • 在某些情况下,sed和grep的可能无法正常工作
  • 其中,我认为最大的可能就是编码或者控制字符的问题

匹配异常案例

我在Windows端用powershell的函数创建了一个包含多个时间戳的文件

生成引发问题的powershell脚本
Write-Output 'clear the old content...'
# ''>text1
# remove empty line:
Clear-Content .\text1

Write-Output 'generating n lines content'
1..100 | ForEach-Object {
    
    # $_.ToString()>>.\text1
    # $_.ToString() >> text1
    # "$_"+"line+$(gdt.ticks)">>text1
    "L$($_)$((Get-Date).Ticks)">>.\text1
    # $_
}
# "teset">>text1

cat 的查看选项

关于控制符/空白字符/非打印字符显示
 -v, --show-nonprinting
              use ^ and M- notation, except for LFD and TAB
-E, --show-ends
              display $ at end of each line
  -T, --show-tabs
              display TAB characters as ^I
 -A, --show-all
              equivalent to -vET
引发问题的文本文件
表面内容
  • 在linux端查看,文件内容表面上看是:(cat )
��L82637834872061501239
L83637834872061511251
L84637834872061521729
L85637834872061531253
L86637834872061531253
L87637834872061543390
L88637834872061543390
L89637834872061553069
L90637834872061564965
L91637834872061574806
L92637834872061584797
L93637834872061595208
L94637834872061597156
L95637834872061607141
L96637834872061617478
L97637834872061627133%
实际内容
  • 实际内容(cat -A)却是
M-^?M-~L^@8^@2^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@0^@1^@2^@3^@9^@^M^@$
^@L^@8^@3^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@1^@1^@2^@5^@1^@^M^@$
^@L^@8^@4^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@2^@1^@7^@2^@9^@^M^@$
^@L^@8^@5^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@3^@1^@2^@5^@3^@^M^@$
^@L^@8^@6^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@3^@1^@2^@5^@3^@^M^@$
^@L^@8^@7^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@4^@3^@3^@9^@0^@^M^@$
^@L^@8^@8^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@4^@3^@3^@9^@0^@^M^@$
^@L^@8^@9^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@5^@3^@0^@6^@9^@^M^@$
^@L^@9^@0^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@6^@4^@9^@6^@5^@^M^@$
^@L^@9^@1^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@7^@4^@8^@0^@6^@^M^@$
^@L^@9^@2^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@8^@4^@7^@9^@7^@^M^@$
^@L^@9^@3^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@9^@5^@2^@0^@8^@^M^@$
^@L^@9^@4^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@5^@9^@7^@1^@5^@6^@^M^@$
^@L^@9^@5^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@6^@0^@7^@1^@4^@1^@^M^@$
^@L^@9^@6^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@6^@1^@7^@4^@7^@8^@^M^@$
^@L^@9^@7^@6^@3^@7^@8^@3^@4^@8^@7^@2^@0^@6^@1^@6^@2^@7^@1^@3^@3^@%

正常内容

(清洗处理过的内容)的cat -A查看

L82637834872061501239^M$
L83637834872061511251^M$
L84637834872061521729^M$
L85637834872061531253^M$
L86637834872061531253^M$
L87637834872061543390^M$
L88637834872061543390^M$
L89637834872061553069^M$
L90637834872061564965^M$
L91637834872061574806^M$
L92637834872061584797^M$
L93637834872061595208^M$
L94637834872061597156^M$
L95637834872061607141^M$
L96637834872061617478^M$

sed 调试

  • 使用sed 的debug功能也可以发现编码问题

nl & cat -n

  • 使用nl 和cat -n 处理文件在输入给sed处理会造成意料之外的结果
  • 例如
nl input.txt |sed '/^b.d/p'  -n > output.txt

该操作理论上是看不到任何东西,因为,nl 命令会为文本的各行行首添加行号(阿拉伯数字),导致文本和源文件中读取的不同;

  • 下面这种做法不会造成匹配问题(但是输出的行号会和源文件中的行号不一致
    cat input.txt |sed '/^b.d/p' -n|nl|tee output.txt

总结

  • 使用linux的grep/sed的时候,当一些基本的正则匹配无法达到预期效果,可以通过cat -A来检查文件中的控制字符,这种异常经常发生在windows端的文件传输到linux上处理的时候;(尤其是通过windows的某些脚本生成的文本,更容易含有看不见的控制符号,从而影响sed/grep等工具的工作效果.
  • 大该是因为,powershell是面向对象的shell,某些输出会出人意料

可能的解决办法

  • 如果情况如上所述,那么可以考虑使用powershell 的cat 命令来清洗多余的控制符号(另存清洗后的文件),例如cat file> washedVersionFile

shell脚本文件运行不起来/报错

  • 有些时候,linux上的shell脚本会运行不起来(主要是指,语法上没有问题,外观上确实没甚么问题&逻辑上也没有问题,但就是执行就报错
  • 这种情况一般出现在,脚本文件不是在linux环境编写的
  • 特别是,在windows上编写的脚本,通常无法直接在linux直接运行

可能的原因

  • 回车符/换行符的问题:
  • 在vscode中,我们可以通过将CRLF改为LF后再编辑文件
  • 在这里插入图片描述
错误示例
cxxu@cxxuAli:~$ ./deploy.sh 
./deploy.sh: line 1: cd: $'/home/cxxu/backEnd/\r': No such file or directory

vim/neovim for windows

  • 除了powershell下处理的文件,windows下的其他编辑器(vim)可能也有控制符号的问题
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xuchaoxin1375/article/details/123806025

智能推荐

matlab三维山峰/山脉/山地曲面数据图-程序员宅基地

文章浏览阅读1.7k次。matlab三维山峰/山脉/山地曲面数据图可以使用peaks函数。比如直接peaks(80):peaks(80) z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp..._三位山峰函数图像

android程序猿 沟通篇_android开发程序员不会沟通-程序员宅基地

文章浏览阅读292次。做移动端最难的除了bug和需求,就是沟通了。移动端的沟通远远在其他程序员之上。因为移动端在小公司可以等于:程序猿 + 产品经理(你要自己想一些好的需求,并且把一些难实现的需求转变下变成另一个需求,并且你还需要告诉它这个需要不行,或者说实现不了)+项目经理( 你需要去跟后端说这个需求改了,要后端怎么样,你需要什么接口,接口怎么返回参数,这个软件的实现,需要后端怎么去做。出了什么问题就是找你 )+..._android开发程序员不会沟通

bochs 2.2.6 编译和GDB调试_gdb怎么调试bochs-程序员宅基地

文章浏览阅读1.3k次。Table of Contents1 在ubuntu 10.04上面编译bochs 2.2.6遇到了一些编译问题1.1 修改源文件 symbols.cc1.2 安装如下package:1.3 config1.4 make1 在ubuntu 10.04上面编译bochs 2.2.6遇到了一些编译问题symbols.cc: At global scope_gdb怎么调试bochs

机试练习06:poj3349——哈希表应用-程序员宅基地

文章浏览阅读82次。一、题解方法此题不能采用暴力枚举的办法,利用哈希表先将输入数据分类,然后针对key值相同的雪花,再进一步进行细致地判断。key值采取雪花6个arm值加和,进行粗略比较,因为只有在key值相同的前提下,才有可能两个雪花完全一致。如果两个雪花key值相同,再分别比较每一个arm的长度,顺时针、逆时针比较判断二者异同。只要发现存在相同的雪花,就返回结果。二、题解代码 1...

手把手教你配置:Jenkins+Github+Webhook +Nginx自动化打包部署Vue项目_nginx 配置修改 jenkins 自动部署-程序员宅基地

文章浏览阅读1.3k次。前面的话这篇文章记录阿里云服务器的配置。小柒所使用的系统是CentOS.连接服务器进入自己的云服务器 --》 进入实例:点击更多,重置自己的密码:重置之后,重启实例。点击远程连接:成功登录之后:安装nginxyum -y install nginx// 检查是否安装成功nginx -v 成功安装:安装好的文件位置:/usr/sbin/nginx:主程序/et..._nginx 配置修改 jenkins 自动部署

web表单注册验证过程及源码_注册表单里面性别代码怎么写-程序员宅基地

文章浏览阅读3.1k次。效果图: 第一部分:学习要点:1.核心方法2.option 参数3.工具方法传统的表单提交,需要多次跳转页面,极大的消耗资源也缺乏良好的用户体验。而这款form.js 表单的 Ajax 提交插件将解决这个问题。一.核心方法官方网站:http://ma_注册表单里面性别代码怎么写

随便推点

gvim的简单介绍和常用配置-程序员宅基地

文章浏览阅读1.4w次,点赞11次,收藏87次。文章目录为什么要配置gvim?什么是gvim?配置后gvim什么样子?配置后初始界面如下:配置后代码界面如下:配置前gvim是什么样子?配置前初始界面如下:配置前代码界面如下:为什么要设置自己的gvim?如何配置gvim?在什么地方配置配置前的文件内容(代码)如下:配置后的文件内容(代码)如下:总结感想为什么要配置gvim?什么是gvim?我也不说什么具体概念了。最直观来说gvim就是一个文档编辑器,只要你的工作和文档有关,无论你是日常办公还是苦逼的程序员,gvim是你的一个不错的选择。注:强烈推荐_gvim

H5活动抽现金红包,微信第三方APi接口代发红包_代发微信红包-程序员宅基地

文章浏览阅读3.8k次。最近需要做一个能抽奖发红包的H5活动,用在微信上,本身微信支付自带了发红包功能,但是奈何开通此功能需要微信支付入驻满90天并且有1个月以上的交易流水,所以就放弃了,然后采用第三方接口实现红包,第三方接口正常的逻辑是:钱充值到第三方平台,其实钱是冲到了第三方的微信支付账号,然后调用第三方接口,第三就给用户发送红包链接,用户点击就可以领取红包啦。这里采用的第三方接口是:摇摇啦SCRM(技术Wechat:18674509508) 正常流程是:1、注册账号;2、可以找技术申请接口测试权限;3、正式使用的_代发微信红包

poj2121(简单模拟题)-程序员宅基地

文章浏览阅读937次。题意:给出英文,翻译成数字形式。分析:运用sscanf函数将每个数字提取出来,用num[i]存这些数字,数字中有100,1000,1000000是位权,因为如果像普通的比如twenty two的话,只要简单的相加。那么碰到关键词我是这么想的,我建立四个int型变量hsum,tsum,msum和sum。看名字可以看出hsum就是用来存碰到关键词hundred时的和,其他依此类推,sum就存没有关_poj2121

yolov5选择合适自己的超参数-超参数进化Hyperparameter Evolution_yolov5超参数进化-程序员宅基地

文章浏览阅读2.9w次,点赞35次,收藏290次。yolov5选择合适自己的超参数-超参数进化Hyperparameter Evolution前言1. 初始化超参数2. 定义fitness3. 进化4. 可视化报错问题前言yolov5提供了一种超参数优化的方法–Hyperparameter Evolution,即超参数进化。超参数进化是一种利用 遗传算法(GA) 进行超参数优化的方法,我们可以通过该方法选择更加合适自己的超参数。提供的默认参数也是通过在COCO数据集上使用超参数进化得来的。由于超参数进化会耗费大量的资源和时间,如果默认参数训练出来的结_yolov5超参数进化

Java项目:基于java+ssm富锦市业余足球联赛管理系统-程序员宅基地

文章浏览阅读271次。足球联赛管理系统主要目的是对足球联赛中心所有的足球联赛信息进行管理,并且合理管理好管理员发布球队、球员和比赛信息,会员浏览查看球队和比赛信息的流程。提高足球联赛管理的工作效率,降低管理的成本。本系统选用Windows作为服务器端的操作系统,开发语言选用Java,数据库选用Mysql,SSM(Spring+SpringMVC+MyBatis)框架,使用mybatis数据库连接技术,使用eclipse作为系统应用程序的开发工具,Web服务器选用Tomcat版本。下面分别简单阐述一下这几个功能模块需求。1.登

jsdbc mysql.ocx_JS直接访问数据 -SQLite | 学步园-程序员宅基地

文章浏览阅读146次。JavaScript DataBase ConnectorJSDBC:提供Javascript有效的连接数据库,目前支持MySQL、SQLite、ACCESS,后期会支持更多的数据库;在从事AJAX开发的工程师肯定会希望有一个通过AJAX直接连接数据库的组件,这样,可以省掉后台很多的操作步骤,比如免去了部署JAVA的运行环境,免去了写很多复杂的JDBC调用,不管出于调试的需要还是应用的需要,JSD..._jsdbc