Linux的实用命令(四)之替换sed命令和特殊字符处理

时间:2024-11-19 06:58:14

Linux中的特殊字符的处理

1、windows和linux环境下的换行符号处理:
Windows系统中有如下等价关系:
   用enter换行 <====> 程序写\n  <====> 真正朝文件中写\r\n(0x0d0x0a) <====>程序真正读取的是\n
linux系统中的等价关系:
   用enter换行 <====> 程序写\n  <====> 真正朝文件中写\n(0x0a)  <====> 程序真正读取的是\n

实际上Windows上的文件是dos格式的, 而linux上的文件是unix格式的, 我们可以通过linux上的dos2unix和unix2dos来实现转化

** 怎么查看文件格式?**
vi filename
然后执行 :set ff查看一下,结果发现fileformat=dos 那么该文件是windows格式, 如果发现fileformat=unix则文件是linux格式。
在这里插入图片描述
如果是直接复制windows上编辑好的filename(filename可以是脚本文件,或者是普通文件)导linux上来执行的报错的话:
方法一:直接执行 sed -i “s/\r//” filename 来转化, 然后就可以执行filename运行脚本了
方法二: 直接执行 dos2unix filename 来转化, 然后就可以执行filename运行脚本了。(我的linux上执行dos2unix filename失败, 但是不要放弃啊, 加个busybox就可以了)
在这里插入图片描述

2、 linux环境下的特殊不可见字符 处理:

1) 查看文件中特殊不可见字符
正常执行查看文件前20行: head -n 20 filename
查看文件中(带不可见字符 ): head -n 20 filename | od -c

2)sed命令
标准用法: sed “s/被替换的字符/替换后的字符/g” (如果又必要替换和被替换的字符需要加转义符号反斜杠 \)
ASCII码 0x1F(0x只是代表是哪个编码集,1F才是对应的代表单元分割符US,肉眼不可见字符,0x7c中的7c代表竖线|分割符)
sed “s/\x7c/\x1F/g” —这个意思是把肉眼不可见分割符换成竖线分割符。

原始数据 里面有1行数据: 1|2
需求:把\x7c 换成\x1F
tail | sed “s/\x7c/\x1F/g” —结果是1 2
在这里插入图片描述
替换文件的分割符(的文件中的空格替换成逗号并生成另外一个文件)
sed ‘s/ /,/g’ >

删除文件特定行
删除第一行
sed -i ‘1d’ filename
范围删除,删除1-3行
sed -i ‘1,3d’ filename
删除第n行
sed -i ‘nd’ filename
删除最后一行
sed -i ‘$d’ filename

3) echo 命令
-e:激活转义字符。使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

使用方法:echo -e " 下面的特殊字符 "
\a 发出警告声;

\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;

例子:
vi

# !/bin/sh
echo -e "hello \c"
echo "world"   

最后sh 打印出来的是hello world , \c 是为了不换行。

4) if 判断中参数

[-z string] “string”的长度为零则为真
[string1 -o string2] “string” 表示或者,string1或者string2

标准格式:
if [ -z 字符串1 -o -z 字符串2] ; then
fi

例子:
在这里插入图片描述
意思是如果" H D F S P A T H " 是 空 或 者 " {HDFS_PATH}" 是空或者 " HDFSPATH""{LOCAL_PATH}" 是空 或者" F I L E N A M E " 是 空 或 者 " {FILE_NAME}" 是空 或者 " FILENAME""{STAT_TIME}" 是空 或者"${VERF_FILE_DELIMITED}" 是空。