`echo $1 sed 's/[[:print:]]\40\$//' ` 是啥意思啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了`echo $1 sed 's/[[:print:]]\40\$//' ` 是啥意思啊?相关的知识,希望对你有一定的参考价值。

我们拆解来看,这是你给出的整个语句: 

`echo $1 | sed 's/[[:print:]]\\40\\$//' `

    整个语句被反引号``包围,说明这是一个命令。

    举例来说: 脚本中有一句a=`ls`,单纯在交互式shell中ls很好理解,即列出当前目录中的内容,而在脚本中要将shell命令执行后的结果进行赋值,其中一种方式就是将命令用反引号``引起来,所以标题中给定的句子实际上最终得到的是某个命令的执行结果,而这个命令是啥就要看反引号``中的这一串命令流执行后得到的是啥了。

    我们具体看一下反引号中的内容,在具体看反引号中内容的时候我们先解释一下反引号中这个命令流的重点部分:

        a. echo命令,它最常见的用法是后面接一个参数,作用就是将接的那个参数回显出来,如你在命令行输: echo 1回车后你就会看到1,echo 变量,回车后你看到的就是变量的值,这个很命令很简单

        b.sed命令,它的作用是处理文本;就本例来说语法可以简单的理解为: sed '命令' 文本流 这三部分;得到的结果就是’命令‘部分作用于'文本流'后的输出

        c.管道符: | ,它的作用是将它前面的命令输出作为后面命令的输入. 按标题中的给定的语句来说管道符应该在sed命令之前,但是放在sed命令之后说感觉逻辑上更好理解一些

    好,反引号中的重点都解释了,再回过头来看echo $1 | sed 's/[[:print:]]\\40\\$//'这条语句的作用就是将$1的内容通过管道作为sed命令处理的文本流,即最终的结是's/[[:print:]]\\40\\$//'这个命令对$1文本流的处理结果!还是举例来说一下这块吧,假设我执行脚本时输入的是./test.sh lsbbq,而test.sh这个脚本中有一句是 a=`echo $1 | sed 's/bbq//'`,则这一句的执行过程可以理解为:

    1.生成临时文件tmp:

    echo lsbbq >tmp  //即tmp中的值为字符串"lsbbp"

    2.通过管道符将tmp作为sed的处理对象:

    sed 's/bbq//' tmp       //作用是将tmp中的bbq替换为空,因为tmp文件中就一行内容为lsbbq,而我们又将bbq替换为空,即最后得到的是一个字什串ls

    3.将`ls`的结果赋给变量a

    *.echo $1 | sed 's/[[:print:]]\\40\\$//'命令中sed后面没有处理的文件名,可能没用过管道的会很奇怪,如果没有管道的话你肯定要加文件名的不然处理谁呢,但是有了管道之后就可以省了文件名,因为你处理的内容是由管道前面传过来的

   *.说明:因为没有看过相应命令的原理,可能上面说的临时文件呀可能实际的执行过程并不是这样,我自己学习的时候是这样理解的

最后说下s/[[:print:]]\\40\\$//,前面替换的结构已经说过了

                s/要被替换的内容/替换后的内容/

而标题中第2,3个斜杠里是没有内容的,这说明将1,2个斜杠中的内容替换为空,说白了就是将1,2个斜杠中的内容删掉,而第1,2个斜杠中的内容为:

                        [[:print:]]\\40\\$ 

上面这个正则我们倒着看,$表示行的结尾,X\\n\\表示匹配n个X,   就本例来说X是[[:print:]],而n是40,即匹配40个[[:print:]],如此一来这个正则就通了,匹配的是行结尾前的40个[[:print:]](可打印字符)

所以`echo $1 | sed 's/[[:print:]]\\40\\$//' `最终的意思就是:将传给脚本的第1个参数的后40个可打印字符删掉,剩余的部分作为要执行的shell命令,得到的结果就是该命令执行后返回的内容。

最终的结果:你根据你的$1的值去套一下  

*.[[:print:]]这类写法代表的是一类东西是一个统称,正则中还有不少类似的写法,具体要下来细看

//写的挺乱的,希望对你有一点点帮助吧

参考技术A 将最后40个可打印字符替换为空

在Linux中执行sed命令报错“-e expression #1, char 15: unterminated `s‘ command“

异常

[root@VM-16-10-centos ~]# echo "This is a test" | sed 's/test/big test'
sed: -e expression #1, char 15: unterminated `s' command

错误代码

echo "This is a test" | sed 's/test/big test'

原因

sed命令的s命令格式应该是sed 's/待替换的字符串/替换后的字符串/'。即应该有三根斜杠/进行区分。

正确代码

echo "This is a test" | sed 's/test/big test'

以上是关于`echo $1 sed 's/[[:print:]]\40\$//' ` 是啥意思啊?的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本如何把反斜杠替换成斜杠反斜杠,比如2014\/5\/10变成2014/5/10,急用谢谢!

在Linux中执行sed命令报错“-e expression #1, char 15: unterminated `s‘ command“

在Linux中执行sed命令报错“-e expression #1, char 15: unterminated `s‘ command“

sed 自动就地替换吗?

sed:-e表达式#1,字符27:在`s'命令的RHS上无效的引用 1

linux命令怎么把一个文档下的所有文件都改名?