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.dat 里面有1行数据: 1|2
需求:把\x7c 换成\x1F
tail 1.dat | sed “s/\x7c/\x1F/g” —结果是1 2
替换文件的分割符(1.csv的文件中的空格替换成逗号并生成另外一个文件2.csv)
sed ‘s/ /,/g’ 1.csv >2.csv
删除文件特定行
删除第一行
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 1.sh
# !/bin/sh
echo -e "hello \c"
echo "world"
最后sh 1.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}" 是空。