当前位置: 首页 > Linux

zsh开发指南(字符串处理之三:转义字符和格式化输出)

时间:2023-04-06 22:14:01 Linux

指南上篇文章讲了zsh常用的字符串操作,本文开始讲比较琐碎的转义字符和格式化输出相关信息。包括转义字符、引号、print、printf等的使用。很多内容不需要死记硬背,在说明书中可以作为参考。转义字符转义字符是许多编程语言中的一个概念。主要解决一些由于没有对应的键盘按键、字符本身有特殊含义(如\、")或显示不直观(如难以区分多个空格和制表符)而无法直接输出的字符。最常用的转义符有\n(换行符)、\r(回车符)、\t(制表符)。直接使用echo、print或printf等内置命令可以正常输出转义符,但包含转义符的字符串需要用引号展开(单引号和双引号都可以)%echo'Hello\n\tWorld'HelloWorld常用转义符对照表,不常用的可以查ASCII码表,然后使用\xnn(如\x14).转义符含义ASCII码值(十六进制)n换行0ar回车0dttab09\\\5c\``60\xnn取决于nnnn可以使用hexdump命令查看字符的ASCIIcodevalue.%echoab=|hexdump-C0000000061623d0a|ab=.|00000004有一些字符是可以选择转义的(通常是有特殊含义的字符),比如空格、"、'、*、~、$,&,(,),[,],{,},;,?等,即如果在引号内,则不需要转义(即使转义没有错,转义方法说在前面加一个\),但是如果在引号外,需要转义。为了谨慎起见,所有包含半角符号的字符串都可以用引号括起来,以免造成不必要的麻烦。可以通过这种方式检查一个字符是否需要在空格外进行转义,输出前带\的所有字符都是必须的。%str='~!@#$%^&*()_+-={}|[]:;<>?,./"'#-r选项表示忽略字符串中的转义#${(q)str}作用是为字符串中的特殊符号添加转义符号%print-r${(q)str}\~\!@\#\$%\^\&\*\(\)_+-=\{\}\|\[\]:\;\<\>\?,./\"单引号左右单引号主要是为了避免字符串中特殊字符的影响。在单引号内,只有一个字符需要转义,即转义符号\。所以如果字符串中包含特殊符号,最好使用单引号,以免造成不必要的麻烦。但是单引号里不能再有单引号了,即使加了转义符。如果字符串需要包含单引号,可以使用这些方法。#使用双引号包含%echo"a'b"a'b#使用转义符号%echoa\'ba'b#同时使用单引号和转义符号,用于包含单引号和其他特殊符号的场景%echo'a"\'\''b*?'a"\'b*?双引号类似于单引号,但不像单引号那么严格。一些特殊字符可以继续在双引号中起作用。#要使用变量%str=abc%echo"$str"abc#你可以使用$()来运行命令%echo"$(ls)"gittmp#你可以使用``来运行命令,不推荐使用``%echoinscripts"`date`"MonAug2809:49:11CST2017#Youcanuse$(())tocalculatethevalue%echo"$((1+2))"3#你可以use$[]tocalculatethevalue%echo"$[1+2]"3简单的说,$加各种东西的用法用双引号可以正常使用,而其他特殊符号(如*,?,>)通常不可用。BackticksBackticks用于运行命令,返回命令的结果保存到变量等%str=`ls`%echo$strgittmp#$()可以用来代替%str=$(ls)%echo$strgittmp反引号的作用和$()基本一样,但是$()可以嵌套,反引号不起作用,而且反引号看起来比较笨重,而且在某些字体中区别不大反引号和单引号。所以不建议在脚本中使用反引号。打印命令用法print是一个类似于echo的内部命令(echo命令很简单,就不介绍了),但是它的功能比echo强大的多。完全可以使用打印而不是回显。不带参数的print和echo的功能基本相同,但是如果字符串中包含转义字符,有些情况可能会不一致。如果需要输出转义字符,尽量统一使用print,避免不一致带来的麻烦。%print'Line\tone\n\Line\ttwo'LineoneLinetwo#echo的输出和print不一致%echo'Line\tone\n\Line\ttwo'Lineone\Linetwoprint有很多参数,输入print在zsh-然后按tab查看选项帮助(如果不行,需要在.zshrc中配置补全选项,网上有很多现成的配置)。#-直接按tab后,C是完成的%print-C--option---C--打印指定列数的参数-D--替换任何使用~符号命名目录的参数-N--printargumentsseparatedandterminatedbynulls...打印命令选项功能介绍这里按常用顺序介绍所有选项。另外,文末有“打印选项列表”,方便查询。-l用于在单独的行上输出字符串。#每个字符串一行,字符串之间用空格隔开%print-laabbaabb#数组也可以连接,数组相关的内容后面再说#命令后的多个字符串可以用数组代替,效果是一样的%array=(aabb)%print-l$arrayaabb-n用来不在输出的末尾自动加一个换行符(echo命令也有这个用法)。%printabcabc#这个%是高亮的,表示行尾没有换行符%print-nabcabc%-m用于只输出匹配到的字符串。%print-m"aa*"aabbabcaacaabbaac-o/-O/-i用于对字符串进行排序。#print-o将字符串升序排列%print-oadc1bg3s13abcdgs#print-O将字符串降序排列%print-Oadc1bg3ssgdcba31#添加-i参数后,大小写不区分%print-oiABCacABCAaABBCccC#如果不加-i,小写排在大写前面%print-oABCacABCaAABBcCC-r用来不转义字符串。默认情况下,print转义转义字符,加上-r后,原样输出。%print-r'\n'\n-c用于按列输出字符串。如果对自动确定的列数不满意,可以用-C指定列数。%print-cabbbbbcccdddddeeffffffgghhhhhhiijjkkaccceeggiikkbbbbbddddffffffhhhhhhjj-C用于输出指定列数的字符串。#从上到下%print-C3abbcccddddeefaccceebbddddf%print-C3abbcccddddeefgaddddgbbeecccf#添加-a后,从左到右变化%print-a-C3abbcccddddeefgabbcccddddeefg-D用于将限定路径名转换成带~的格式,~为家目录。%print-D/home/goreliu/git~/git#mine定义为hash-dmine='/mnt/c/mine'%print-D/mnt/c/mine~mine-N用于输出字符串由\x00(空)分隔,而不是空格。这对于包含空格的字符串可能很方便,并且xargs等命令也可以接受\x00分隔的字符串。%打印-Naabbccaabbcc%%打印-Naabbcc|hexdump-C00000000616100626200636300|aa.bb.cc.|00000009-x用于将行首的制表符替换为空格。-x是将行首的tab扩展成空格,-x后面的参数是一个tab对应的空格数。%打印-x2'\t\tabc'|十六进制转储-C00000000202020206162630a|abc.|00000008%打印-x4'\t\tabc'|206162630a|abc.|0000000c-X用于将所有制表符替换为空格。请注意,它不是简单地替换为空格。例如每行有一个制表符,-X8,那么如果制表符前有5个字符(到行首或上一个制表符),则补3个空格补8。这个完成对齐每一列。但是如果前面有8个或更多字符,那么一个tab还是换成8个字符,因为一个tab不能凭空消失,至少要转换成一个空格。如果你不明白,试着自己找到规则。%打印-X2'ab\t\tabc'|hexdump-C000000006162202020206162630a|ababc.|2020202020206162630a|ababc.|0000000c-u用于指定fd输出。print默认为fd1,也就是stdout,可以指定为其他fd(2是stderr,其他的可以运行ls-l/proc/$$/fd查看。%print-u2goodgood#效果相同asredirectedoutput%printgood>&2-v用于将输出保存到一个变量中#与str="$(printaabbcc)"%print-vstraabbcc%echo$straa效果相同bbcc-s/-S用于将字符串保存到历史记录中%print-sls-a%history|tail-n12222ls-a#-S也类似,只是需要把命令括起来引号内%print-S"ls-a"%history|tail-n12339ls-a-z用于将字符串输出到命令行编辑区#_为光标位置%print-zaabbcc%aabbcc_-f用于输出指定格式的字符串,同printf,用法见“printf命令用法”-P用于输出带颜色和特殊样式的字符串,见“输出带颜色和特殊样式的字符串”.-b用于识别bindkey字符串中的转义字符,bindkey是Zle的快捷键配置内容,写脚本时不会用到,所以不做介绍。-R用于模拟echo命令,只支持-n和-e选项,一般不用。printf命令用法printf命令非常类似于c语言的printf函数,用于输出一个格式化的字符串。#输出末尾的%表示该行末尾没有换行符#printf不会在输出末尾添加换行符#为避免误解,下面的例子省略了这个符号%printf":%d%f:"1234.56:1234.560000:%printf的第一个参数是格式字符串。在zsh中输入printf%并按Tab键查看所有支持的用法。这里只是举几个比较常见的例子。#整数浮点数字符串%printf"%d%f%s"1212.34abcd1212.340000abcd%#取小数点后几位%printf"%.1f"12.3412.3#科学计数法输出浮点数%printf"%e"12.341.234000e+01#十进制转十六进制输出%printf"%x"12c#补空格或0%printf"%5d\n%05d"12121200012完整的格式我贴在这里,简单寻找。--打印格式说明符----带符号转换的正数前留一个空格--左调整结果。--精度'--千位分隔符*--下一个参数中的字段宽度#--替代形式%--百分号+--总是在有符号转换的数字前放置符号0--零填充到长度b--as%sbut解释参数中的转义序列c--打印参数的第一个字符Ee--科学记数法中的双数f--双数Gg--双数为%f或%e取决于大小id--带符号的十进制数或前导"以下字符的数值n--存储参数指定的打印字节数argumento--无符号八进制数q--作为%s但shell引用结果--将参数打印为字符串u--无符号十进制数Xx--无符号十六进制数,字母大写为x输出带颜色和特殊样式的字符串使用zsh的print-P可以方便的输出带颜色和特殊样式的字符串,不用再处理\033[41;36;1m#%Bbold%bcancelbold#%F{red}Foregroundcolor%f取消前景色#%K{red}背景色%k取消背景色#%U下划线%u取消下划线#%S反色%s取消反色##blackor0redor1#greenor2yellowor3#blueor4magentaor5#cyanor6whiteor7#displayboldredabc%print-P'%B%F{red}abc'abc#没有覆盖的功能可以使用原来的转义符号可读性差#4[0-7]backgroundcolor#3[0-7]foregroundcolor#0mnormal1mbold2mgray3mitalic4mslidemoney5mflash6mfastflash7mreverseColor#显示闪烁的红底绿字abc%print"\033[41;32;5mabc\033[0m"abcprint选项列表为了方便查询,我把打印选项列表放在这里。Option函数参数-C按列输出列数-D用版本替换路径~无-N使用x00作为字符串的间隔无-O按降序排序无-P输出颜色和特殊样式无-R模拟回显命令无-S将命令放入历史命令文件(带引号)不加-X将所有tab换成空格tab对应空格个数-a和-c/-C一起使用,不加-b从左到右改为identifythebindkeyturnUnambiguousstringNone-c按列输出(自动判断列数)None-f与printf一起使用时None-i和-o/-O,不区分大小写排序None-l使用换行符作为字符串分隔符None-m只输出匹配的字符串matchpatternstring-n不自动添加最后的换行符none-o升序排序none-r不处理转义字符none-s将命令放入历史命令文件(不带引号)none-u指定fd到outputfdnumber-v将内容保存到变量变量名-x将行首的tab替换为空格tab对应空格数-z将内容放入命令行编辑区无参考http://zsh.sourceforge.net/顾...本文不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguide付费解决Windows、Linux、Shell、C相关问题,C++,AHK,Python,JavaScript,Lua等领域,定价灵活,欢迎咨询,微信ly50247。