shell 对应特殊字符

echo -e


awk

sed

cut




echo "Cfoo'barxml" | sed "s/'/::/g" |  sed 's/::/\\:/g' |  sed "s/:/'/g"    替换单引号为 \'

 

------------------------

sed 替换单引号'

echo "mmm'sss" > test
cat test


把test内容中单引号替换成双引号
sed 's/'"'"/'"''/g' test  ==> sed 's/' " ' " / ' " ' '/g' test
解析下:
's/' => 要进行替换操作,后紧跟匹配字符
"'" => 用双引号包裹着单引号
/   =>分割符
'"'  => 用单引号包裹着双引号
'/g' =>分隔符,全局替换


当然还可以使用下面这两种方法替换:
sed s#\'#\"#g test   最外层使用#分隔,里面使用转义单引号,转义双引号
sed "s/'/\"/g" test    最外层使用双引号,里面使用单引号,转义双引号


echo "mmm'sss"  | sed 's/'"'"/'"''/g'
echo "mmm'sss"  | sed s#\'#\"#g
echo "mmm'sss"  | sed "s/'/\"/g"

 

awk '{print "sed '\''s/"$1"\\t/"$2"\\t/g'\'' ref_Zv9_top_level.bed.chrom"}' ref_Zv9_top_level.gff3_transID

sed 's/rna10004\t/XR_223343.1\t/g' ref_Zv9_top_level.bed.chrom
sed 's/rna10000\t/XR_223342.1\t/g' ref_Zv9_top_level.bed.chrom

 

sed 's/\]/\"/g'   替换]为“

sed 's/\[/\"/g'   替换[为“

 echo "Cfoo'barxml" | sed "s/'/::/g" |  sed 's/::/\\:/g' |  sed "s/:/'/g"    替换单引号为 \'

 

------------------------

sed 替换单引号'

echo "mmm'sss" > test
cat test


把test内容中单引号替换成双引号
sed 's/'"'"/'"''/g' test  ==> sed 's/' " ' " / ' " ' '/g' test
解析下:
's/' => 要进行替换操作,后紧跟匹配字符
"'" => 用双引号包裹着单引号
/   =>分割符
'"'  => 用单引号包裹着双引号
'/g' =>分隔符,全局替换


当然还可以使用下面这两种方法替换:
sed s#\'#\"#g test   最外层使用#分隔,里面使用转义单引号,转义双引号
sed "s/'/\"/g" test    最外层使用双引号,里面使用单引号,转义双引号


echo "mmm'sss"  | sed 's/'"'"/'"''/g'
echo "mmm'sss"  | sed s#\'#\"#g
echo "mmm'sss"  | sed "s/'/\"/g"

 

awk '{print "sed '\''s/"$1"\\t/"$2"\\t/g'\'' ref_Zv9_top_level.bed.chrom"}' ref_Zv9_top_level.gff3_transID

sed 's/rna10004\t/XR_223343.1\t/g' ref_Zv9_top_level.bed.chrom
sed 's/rna10000\t/XR_223342.1\t/g' ref_Zv9_top_level.bed.chrom

 

sed 's/\]/\"/g'   替换]为“

sed 's/\[/\"/g'   替换[为“


说到shell通配符(wildcard),大家在使用时候会经常用到。下面是一个实例:

1
 
1
2
3
4
[chengmo@localhost ~ /shell ]$ ls
a.txt  b.txt  c.old
 
#2
1
2
3
4
[chengmo@localhost ~ /shell ]$ ls  *.txt
a.txt  b.txt
 
#3
1
2
[chengmo@localhost ~ /shell ]$ ls  d*.txt
ls : 无法访问 d*.txt: 没有那个文件或目录

从上面这个实例,不知道大家有没有发现问题呢。我们先了解一下,通配符相关知识,再分析下这个实例吧。

一、linux shell通配符(wildcard)

通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在 命令的“参数”里(它不用在 命令名称里, 也不用在 操作符上)。当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

 

我们回过头分析上面命令吧:在第2个命令中,*.txt 实际shell搜索文件,找到了符合条件的文件,命令会变成:ls a.txt b.txt ,实际在执行ls 时候传给它的是a.txt b.txt .

 

而命令3,d*.txt 由于当前目录下面没有这样的文件或目录,直接将”d*.txt” 作为ls 参数,传给了 ls .这个时候”*” 只是一个普通的 ls 参数而已,已经失去了它通配意义。 由于找不到文件,所以会出现:无法访问提示!

了解了shell通配符,我们现在看下,shell常见通配符有那一些了。

shell常见通配符:

字符 含义 实例
* 匹配 0 或多个字符 a*b  a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
? 匹配任意一个字符 a?b  a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
[list]  匹配 list 中的任意单一字符 a[xyz]b   a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list]  匹配 除list 中的任意单一字符 a[!0-9]b  a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。
[c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] a[0-9]b  0与9之间必须也只能有一个字符 如a0b, a1b... a9b。
{string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b    a与b之间只能是abc或xyz或123这三个字符串之一。

 

需要说明的是:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆。把通配符理解为shell 特殊代号字符就可。而且涉及的只有,*,? [] ,{} 这几种。

 

 

二、shell元字符(特殊字符 Meta)

shell 除了有通配符之外,由shell 负责预先先解析后,将处理结果传给命令行之外,shell还有一系列自己的其他特殊字符。

字符 说明
IFS 由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。
CR 由 <enter> 产生。
= 设定变量。
$ 作变量或运算替换(请不要与 shell prompt 搞混了)。
> 重导向 stdout。 *
< 重导向 stdin。 *
| 命令管线。 *
& 重导向 file descriptor ,或将命令置于背境执行。 *
( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 *
{ } 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。
; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 *
&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令。 *
|| 在前一个命令结束时,若返回值为 false,继续执行下一个命令。 *
! 执行 history 列表中的命令。*

加入”*” 都是作用在命令名直接。可以看到shell 元字符,基本是作用在命令上面,用作多命令分割(或者参数分割)。因此看到与通配符有相同的字符,但是实际上作用范围不同。所以不会出现混淆。

 

以下是man bash 得到的英文解析:

metacharacter
              A character that, when unquoted, separates words.  One of the following:
              |  & ; ( ) < > space tab
control operator
              A token that performs a control function.  It is one of the following symbols:
              || & && ; ;; ( ) | <newline>

 

三、shell转义符

有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。

字符 说明
‘’(单引号) 又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。
“”(双引号) 又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替
\(反斜杠)   又叫转义,去除其后紧跟的元字符或通配符的特殊意义。

man bash 英文解释如下:

There are three quoting mechanisms: the escape character, single quotes, and double quotes.

实例:

 

1
2
3
4
5
6
7
8
9
10
11
[chengmo@localhost ~ /shell ]$ ls  \*.txt
ls : 无法访问 *.txt: 没有那个文件或目录
 
[chengmo@localhost ~ /shell ]$ ls  '*.txt'
ls : 无法访问 *.txt: 没有那个文件或目录
 
[chengmo@localhost ~ /shell ]$ ls  'a.txt'
a.txt
 
[chengmo@localhost ~ /shell ]$ ls  *.txt
a.txt  b.txt

 

可以看到,加入了转义符 “*”已经失去了通配符意义了。

四、shell解析脚本的过程

看到上面说的这些,想必大家会问到这个问题是,有这么想特殊字符,通配符,那么 shell在得到一条命令,到达是怎么样处理的呢?我们看下下面的图:

1

如果用双引号包括起来,shell检测跳过了1-4步和9-10步,单引号包括起来,shell检测就会跳过了1-10步。也就是说,双引号 只经过参数扩展、命令代换和算术代换就可以送入执行步骤,而单引号转义符直接会被送入执行步骤。而且,无论是双引号转义符还是单引号转义符在执行的时候能够告诉各个命令自身内部是一体的,但是其本身在执行时是并不是命令中文本的一部分。


在shell运行命令中,单双引号总能引起或多或少的话题讨论,这边做个小总结

 

先看以下例子:

[python]  view plain  copy
  1. sosodream@ubuntu:~>echo '/t'|xxd  
  2. + xxd  
  3. + echo '/t'  
  4. 00000005c74 0a                                  /t.  
  5. sosodream@ubuntu:~>echo -e '/t'|xxd  
  6. + xxd  
  7. + echo -e '/t'  
  8. 0000000090a                                     ..  
  9. sosodream@ubuntu:~>echo $'/t'|xxd  
  10. + xxd  
  11. + echo '        '  
  12. 0000000090a                                     ..  
  13. sosodream@ubuntu:~>echo -e $'/t'|xxd  
  14. + xxd  
  15. + echo -e '     '  
  16. 0000000090a                                     ..  
  17. sosodream@ubuntu:~>echo "/t"|xxd  
  18. + xxd  
  19. + echo '/t'  
  20. 00000005c74 0a                                  /t.  
  21. sosodream@ubuntu:~>echo -e "/t"|xxd  
  22. + xxd  
  23. + echo -e '/t'  
  24. 0000000090a                                     ..  
  25. sosodream@ubuntu:~>echo  $"/t"|xxd  
  26. + xxd  
  27. + echo '/t'  
  28. 00000005c74 0a                                  /t.  
  29. sosodream@ubuntu:~>echo -e  $"/t"|xxd  
  30. + xxd  
  31. + echo -e '/t'  
  32. 0000000090a                                     ..  
  33. sosodream@ubuntu:~>  

 

 

实际上,分析单双引号,要从二个层面上去考虑以上边的例子:

第一层:shell传递参数给echo前进行的扩展解析
第二层:echo接受参数,处理,显示结果

 

 

具体分析如下:

第一层:shell传递参数给echo前进行的扩展解析

  单引号:shell单引号不进行字符转义
          原文:Enclosing characters in single quotes preserves the literal value of each character within the quotes. 
  双引号:不进行字符转义,除了三个字符$, `, /,和开启命令扩展后的!字符

  $加单引号(即$''):除了以下字符转义,其他同单引号
              /a     alert (bell)
              /b     backspace
              /e     an escape character
              /f     form feed
              /n     new line
              /r     carriage return
              /t     horizontal tab
              /v     vertical tab
              //     backslash
              /'     single quote
              /nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
              /xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
              /cx    a control-x character

      $加双引号($""):实际上与locale设置有关,在C和POSIX下的locale下等同于没带$的双引号
                  原文:cause the string to be translated according to the current locale.  If the current locale is C or POSIX, the dollar sign is ignored.

第二层:echo接受参数,处理,显示结果
          不加-e:按字符显示
          加-e:  判断并显示转义(就算你原本打算传进去的就是二个字符,比如'/t')

 

 Sed: stream editor for filtering and transforming text

Table of Contents
1. Sed简介 
2. 定址 
3. Sed命令 
4. 选项 
5. 元字符集 
6. 实例 
7. 脚本

1. Sed简介

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。


2. 定址

可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。


3. Sed命令

调用sed命令有两种形式:


sed [options] 'command' file(s)

sed [options] -f scriptfile file(s)



a/ 
在当前行后面加入一行文本。

b lable 
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。

c/ 
用新的文本改变本行的文本。


从模板块(Pattern space)位置删除行。


删除模板块的第一行。

i/ 
在当前行上面插入文本。


拷贝模板块的内容到内存中的缓冲区。


追加模板块的内容到内存中的缓冲区


获得内存缓冲区的内容,并替代当前模板块中的文本。


获得内存缓冲区的内容,并追加到当前模板块文本的后面。


列表不能打印字符的清单。


读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。


追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。


打印模板块的行。

P(大写) 
打印模板块的第一行。


退出Sed。

r file 
从file中读行。

t label 
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

T label 
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

w file 
写并追加模板块到file末尾。

W file 
写并追加模板块的第一行到file末尾。


表示后面的命令对所有没有被选定的行发生作用。

s/re/string 
用string替换正则表达式re。


打印当前行号码。


把注释扩展到下一个换行符以前。

以下的是替换标记

g表示行内全面替换。

p表示打印行。

w表示把行写入一个文件。

x表示互换模板块中的文本和缓冲区中的文本。

y表示把一个字符翻译为另外的字符(但是不用于正则表达式)


4. 选项

-e command, --expression=command 
允许多台编辑。

-h, --help 
打印帮助,并显示bug列表的地址。

-n, --quiet, --silent 
取消默认输出。

-f, --filer=script-file 
引导sed脚本文件名。

-V, --version 
打印版本和版权信息。


5. 元字符集


锚定行的开始 如:/^sed/匹配所有以sed开头的行。


锚定行的结束 如:/sed$/匹配所有以sed结尾的行。


匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。


匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

[] 
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。

[^] 
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。

/(../) 
保存匹配的字符,如s//(love/)able//1rs,loveable被替换成lovers。


保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

/< 
锚定单词的开始,如://

/> 
锚定单词的结束,如/love/>/匹配包含以love结尾的单词的行。

x/{m/} 
重复字符x,m次,如:/0/{5/}/匹配包含5个o的行。

x/{m,/} 
重复字符x,至少m次,如:/o/{5,/}/匹配至少有5个o的行。

x/{m,n/} 
重复字符x,至少m次,不多于n次,如:/o/{5,10/}/匹配5--10个o的行。

6. 实例
删除:d命令 
$ sed '2d' example-----删除example文件的第二行。

$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。

$ sed '$d' example-----删除example文件的最后一行。

$ sed '/test/'d example-----删除example文件所有包含test的行。

替换:s命令 
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。

$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。

$ sed -n 's//(love/)able//1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。

选定行的范围:逗号 
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。

$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。

$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。

多点编辑:e命令 
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。

从文件读入:r命令 
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。

写入文件:w命令 
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。


追加命令:a命令 
$ sed '/^test/a//--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。

插入:i命令 
$ sed '/test/i//

new line

-------------------------' example

如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。

下一个:n命令 
$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。

变形:y命令 
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。

退出:q命令 
$ sed '10q' example-----打印完第10行后,退出sed。

保持和获取:h命令和G命令 
$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

保持和互换:h命令和x命令 
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。

7. 脚本
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。


比如,如果要打印出含有字串”1024”的行,我就可能会用:
cat filename | sed –n ‘/1024/p’sed命令详解!!(要学习shell的 朋友要好好看看)

 

 

sed /^$/d filename

可以删除文件中的空行。

sed /^[[:space:]]*$/d filename

可以删除内容为多个空格/tab组成的行


http://blog.csdn.net/xhoufei2010/article/details/53521625

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值