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大神,写个脚本也可以。多谢

awk -v FS="" 'gsub(" ","");for(i=1;i<=NF;i+=2)printf("\\\\x%s",$i$(i+1));printf("\\n")' ss.txt >result.txt

结果在result.txt中。

空格去掉了,换行符没有去掉。要去掉换行符吗?

追问

嗯。能行么?

追答

测试通过才放上来的。

用sed更简单:

sed -i 's/ //g;s/../\\\\x&/g' ss.txt

直接修改原文件。


参考技术A cat ss.txt | sed -r -e 's/\s//g' -e 's/(..)/\\x\1/g' 参考技术B #! /bin/bash

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的主要内容,如果未能解决你的问题,请参考以下文章

linux问题解决:Shell中处理包含空格的文件名

linux问题解决:Shell中处理包含空格的文件名

unix下KSH中shell的SED命令怎样把文件中的NULL替换成空格。 (十六进制码00替换成20)

linux shell 中 如何处理空格的路径?

linux下脚本实现从一个文件中读数,有文件多行 (每行都是:名称 + 多个空格 + 数据 ),

Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题