linux shell 问题,清除文件中的空格,并每两个字符中插入\x
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell 问题,清除文件中的空格,并每两个字符中插入\x相关的知识,希望对你有一定的参考价值。
假设文件是ss.txt
内容是:
d7d3 253c 6f63 b881 66d0 af10 0354 7074
f5cf 97ac 35b1 6d6e 0b20 ca7f 8974 e298
怎么将空格去掉,并每两个字符中插入\x,变成xd7\xd3\x25\x3c\x6f\x63\xb8\x81\x66\xd0\xaf\x10\x03\x54\x70\x74\xf5\xcf\x97\xac\x35\xb1\x6d\x6e\x0b\x20\xca\x7f\x89\x74\xe2\x98。
求shell大神,写个脚本也可以。多谢
结果在result.txt中。
空格去掉了,换行符没有去掉。要去掉换行符吗?
追问嗯。能行么?
追答测试通过才放上来的。
用sed更简单:
sed -i 's/ //g;s/../\\\\x&/g' ss.txt直接修改原文件。
Source_file=$1
if [ ! -e $Source_file ]; then
echo "$Source_file do not exist"
exit 1
fi
sed -i 's/[[:space:]]*//g' $Source_file
if [ $? -ne 0 ]; then
echo "Delete spcae error"
exit 1
fi
sed -i 's/\(..\)/\1\\x/g' $Source_file
if [ $? -ne 0 ]; then
echo "Add '\x' error"
exit 1
fi 参考技术C 用正则表达式很简单,
1、/\s+//g
替换掉空格
2、/(..)/\\x$1/g
增加\x
一般linux默认都有perl,就用perl做两个正则表达式替换。
linux问题解决:Shell中处理包含空格的文件名
今天在写脚本的时候碰见了一个问题,在使用脚本对一些文件进行权限更改的时候,报出了意料之外的错误。经过对相关内容的查看,发现罪魁祸首是文件名中的空格。
下面在我的服务器上进行复现:
- 首先是
touch
一个名字里带空格的文件,这里我新建的是文件test 1
,如下图。
- 随后是以常规命令
chmod 777 test 1
来对其进行权限更改操作,如下图。
- 可以看到,
test 1
被理解为了两个文件,所以操作失败,提示这两个文件不存在。对于这种情况,很明显需要加上引号来提示系统这是一个整体,或是加上\\
来对空格进行转义,如下图可以看到命令成功的被执行了。
- 但是,对于shell脚本来讲没有办法这么简单的处理,尤其是脚本中需要修改的文件是通过
find
找出来的变量。由此遇到困难开始想办法解决。
关于解决此问题的思考:
- 首先脚本中没有办法添加引号来使得变量被划为一个整体,所以单独操作时最常用的引号无法使用。
- 其次是否可以通过shell里的字符串函数在文件名中加入转义符
\\
来避免空格的影响,但是我觉得这个应该会影响处理速度。 - 最后能否从根本上直接解决问题,即将文件名中的空格先替换为别的内容,待处理完后再替换为空格。这个说实话我感觉有点麻烦,而且最重要的是在替换时选择替换为什么内容?如果替换的内容本来就在文件名中存在,那么可能在替换回去时会改变原文件名,所以我觉得这个应该不大可行。
最终解决方案:
我在网上冲浪了一会,发现一个应该是效率最高改动最小的解决方案,即修改解释器的单词分隔符。这个东西在bash
中被储存在变量$IFS
中,初始值为\\n\\t
,即空格、回车、tab。在bash
处理内容时会根据这个变量来对字符串进行分割,所以对其中的内容进行修改删去空格,即可让bash
在处理带空格字符串时,不进行分割,从而从根本上解决问题。当然在脚本执行后还得把$IFS
改回去,避免之后出现问题。
相比上文思考中的更改字符串,我觉得还是这个更方便效率高,所以决定使用这个方法对问题进行处理。
- 这是我更改后的代码实例,其中把分隔符IFS改为了
\\n\\b
,待脚本执行完毕后再切回原来的\\n\\t
,从而在不影响bash的情况下完成IFS的更改。
#!/bin/bash
#由于文件名中可能有空格,所以需要更改IFS
SAVEIFS=$IFS
IFS=$(echo -en "\\n\\b")
for file in `find ~ -perm -002 -type f 2>/dev/null`
do
chmod o-wx "$file"
done
IFS=$SAVEIFS
- 这是运行后的结果。可以发现,权限已经被成功的修改了。由此可以验证该写法,对于文件名包含空格的文件和文件名含
\\\\
的文件都可以成功的进行选取,从而正确的解决命令。
- 如果不更改IFS的话,就会出现下面这个问题,所以我认为该问题已解决。
以上是关于linux shell 问题,清除文件中的空格,并每两个字符中插入\x的主要内容,如果未能解决你的问题,请参考以下文章
unix下KSH中shell的SED命令怎样把文件中的NULL替换成空格。 (十六进制码00替换成20)