textproc.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 3,421 行 · 第 1/5 页
HTML
3,421 行
21 22 echo "Original DOS text file is \"$1\"." 23 echo "Converted UNIX text file is \"$NEWFILENAME\"." 24 25 exit 0 26 27 # 练习: 28 # ----- 29 # 修改上边的脚本完成从UNIX到DOS的转换. </PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="ROT13"></A><P><B>例子 12-21. <BCLASS="COMMAND">rot13</B>: rot13, 弱智加密. </B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # rot13.sh: 典型的rot13算法, 3 # 使用这种方法加密至少可以愚弄一下3岁小孩. 4 5 # 用法: ./rot13.sh filename 6 # 或 ./rot13.sh <filename 7 # 或 ./rot13.sh and supply keyboard input (stdin) 8 9 cat "$@" | tr 'a-zA-Z' 'n-za-mN-ZA-M' # "a"变为"n", "b"变为"o", 等等. 10 # 'cat "$@"'结构 11 #+ 允许从stdin或者从文件中获得输入. 12 13 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="CRYPTOQUOTE"></A><P><B>例子 12-22. 产生<SPANCLASS="QUOTE">"Crypto-Quote"</SPAN>游戏(译者: 一种文字游戏)</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # crypto-quote.sh: 加密 3 4 # 使用单码替换(单一字母替换法)来进行加密. 5 # 这个脚本的结果与"Crypto Quote"游戏 6 #+ 的行为很相似. 7 8 9 key=ETAOINSHRDLUBCFGJMQPVWZYXK 10 # "key"不过是一个乱序的字母表. 11 # 修改"key"就会修改加密的结果. 12 13 # 'cat "$@"' 结构既可以从stdin获得输入, 也可以从文件中获得输入. 14 # 如果使用stdin, 那么要想结束输入就使用 Control-D. 15 # 否则就要在命令行上指定文件名. 16 17 cat "$@" | tr "a-z" "A-Z" | tr "A-Z" "$key" 18 # | 转化为大写 | 加密 19 # 小写, 大写, 或混合大小写, 都可以正常工作. 20 # 但是传递进来的非字母字符将不会起任何变化. 21 22 23 # 用下边的语句试试这个脚本: 24 # "Nothing so needs reforming as other people's habits." 25 # --Mark Twain 26 # 27 # 输出为: 28 # "CFPHRCS QF CIIOQ MINFMBRCS EQ FPHIM GIFGUI'Q HETRPQ." 29 # --BEML PZERC 30 31 # 解密: 32 # cat "$@" | tr "$key" "A-Z" 33 34 35 # 这个简单的密码可以轻易的被一个12岁的小孩 36 #+ 用铅笔和纸破解. 37 38 exit 0 39 40 # 练习: 41 # ----- 42 # 修改这个脚本, 让它可以用命令行参数 43 #+ 来决定加密或解密.</PRE></FONT></TD></TR></TABLE><HR></DIV><TABLECLASS="SIDEBAR"BORDER="1"CELLPADDING="5"><TR><TD><DIVCLASS="SIDEBAR"><ANAME="AEN8430"></A><P><B><BCLASS="COMMAND">tr</B>的不同版本</B></P><P> <BCLASS="COMMAND">tr</B>工具在历史上有2个重要版本. BSD版本不需要使用中括号(<KBDCLASS="USERINPUT">tr a-z A-Z</KBD>), 但是SysV版本则需要中括号(<KBDCLASS="USERINPUT">tr '[a-z]' '[A-Z]'</KBD>). GNU版本的<BCLASS="COMMAND">tr</B>命令与BSD版本比较象, 所以最好使用中括号来引用字符范围. </P></DIV></TD></TR></TABLE></DD><DT><ANAME="FOLDREF"></A><BCLASS="COMMAND">fold</B></DT><DD><P>将输入按照指定宽度进行折行. 这里有一个非常有用的选项<CODECLASS="OPTION">-s</CODE>, 这个选项可以使用空格进行断行(译者: 事实上只有外文才需要使用空格断行, 中文是不需要的)(请参考<AHREF="textproc.html#EX50">例子 12-23</A>和<AHREF="contributed-scripts.html#MAILFORMAT">例子 A-1</A>). </P></DD><DT><BCLASS="COMMAND">fmt</B></DT><DD><P>一个简单的文件格式器, 通常用在管道中, 将一个比较长的文本行输出进行<SPANCLASS="QUOTE">"折行"</SPAN>. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX50"></A><P><B>例子 12-23. 格式化文件列表.</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 WIDTH=40 # 设为40列宽. 4 5 b=`ls /usr/local/bin` # 取得文件列表... 6 7 echo $b | fmt -w $WIDTH 8 9 # 也可以使用如下方法, 作用是相同的. 10 # echo $b | fold - -s -w $WIDTH 11 12 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P>请参考<AHREF="moreadv.html#EX41">例子 12-5</A>. </P><DIVCLASS="TIP"><P></P><TABLECLASS="TIP"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/tip.gif"HSPACE="5"ALT="Tip"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>如果想找到一个更强力的<BCLASS="COMMAND">fmt</B>工具可以选择Kamil Toman的工具<BCLASS="COMMAND">par</B>, 这个工具可以从后边的这个网址取得<AHREF="http://www.cs.berkeley.edu/~amc/Par/"TARGET="_top">http://www.cs.berkeley.edu/~amc/Par/</A>. </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">col</B></DT><DD><P>这个命令用来滤除标准输入的反向换行符号. 这个工具还可以将空白用等价的tab来替换. <BCLASS="COMMAND">col</B>工具最主要的应用还是从特定的文本处理工具中过滤输出, 比如<BCLASS="COMMAND">groff</B>和<BCLASS="COMMAND">tbl</B>. (译者: 主要用来将man页转化为文本.) </P></DD><DT><BCLASS="COMMAND">column</B></DT><DD><P>列格式化工具. 通过在合适的位置插入tab, 这个过滤工具会将列类型的文本转化为<SPANCLASS="QUOTE">"易于打印"</SPAN>的表格式进行输出. </P><DIVCLASS="EXAMPLE"><HR><ANAME="COL"></A><P><B>例子 12-24. 使用<BCLASS="COMMAND">column</B>来格式化目录列表</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # 这是"column" man页中的一个例子, 作者对这个例子做了很小的修改. 3 4 5 (printf "PERMISSIONS LINKS OWNER GROUP SIZE MONTH DAY HH:MM PROG-NAME\n" \ 6 ; ls -l | sed 1d) | column -t 7 8 # 管道中的"sed 1d"删除输出的第一行, 9 #+ 第一行将是"total N", 10 #+ 其中"N"是"ls -l"找到的文件总数. 11 12 # "column"中的-t选项用来转化为易于打印的表形式. 13 14 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><BCLASS="COMMAND">colrm</B></DT><DD><P>列删除过滤器. 这个工具将会从文件中删除指定的列(列中的字符串)并且写到文件中, 如果指定的列不存在, 那么就回到<TTCLASS="FILENAME">stdout</TT>. <KBDCLASS="USERINPUT">colrm 2 4 <filename</KBD>将会删除<TTCLASS="FILENAME">filename</TT>文件中每行的第2到第4列之间的所有字符. </P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>如果这个文件包含tab和不可打印字符, 那将会引起不可预期的行为. 在这种情况下, 应该通过管道的手段使用<AHREF="textproc.html#EXPANDREF">expand</A>和<BCLASS="COMMAND">unexpand</B>来预处理<BCLASS="COMMAND">colrm</B>. </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">nl</B></DT><DD><P>计算行号过滤器. <KBDCLASS="USERINPUT">nl filename</KBD>将会把<TTCLASS="FILENAME">filename</TT>文件的所有内容都输出到<TTCLASS="FILENAME">stdout</TT>上, 但是会在每个非空行的前面加上连续的行号. 如果没有<TTCLASS="FILENAME">filename</TT>参数, 那么就操作<TTCLASS="FILENAME">stdin. </TT></P><P><BCLASS="COMMAND">nl</B>命令的输出与<KBDCLASS="USERINPUT">cat -n</KBD>非常相似, 然而, 默认情况下<BCLASS="COMMAND">nl</B>不会列出空行. </P><DIVCLASS="EXAMPLE"><HR><ANAME="LNUM"></A><P><B>例子 12-25. <BCLASS="COMMAND">nl</B>: 一个自己计算行号的脚本. </B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # line-number.sh 3 4 # 这个脚本将会echo自身两次, 并显示行号. 5 6 # 'nl'命令显示的时候你将会看到, 本行是第4行, 因为它不计空行. 7 # 'cat -n'命令显示的时候你将会看到, 本行是第6行. 8 9 nl `basename $0` 10 11 echo; echo # 下边, 让我们试试 'cat -n' 12 13 cat -n `basename $0` 14 # 区别就是'cat -n'对空行也进行计数. 15 # 注意'nl -ba'也会这么做. 16 17 exit 0 18 # -----------------------------------------------------------------</PRE></FONT></TD></TR></TABLE><HR></DIV></DD><DT><BCLASS="COMMAND">pr</B></DT><DD><P>格式化打印过滤器. 这个命令会将文件(或<TTCLASS="FILENAME">stdout</TT>)分页, 将它们分成合适的小块以便于硬拷贝打印或者在屏幕上浏览. 使用这个命令的不同的参数可以完成好多任务, 比如对行和列的操作, 加入行, 设置页边, 计算行号, 添加页眉, 合并文件等等. <BCLASS="COMMAND">pr</B>命令集合了许多命令的功能, 比如<BCLASS="COMMAND">nl</B>, <BCLASS="COMMAND">paste</B>, <BCLASS="COMMAND">fold</B>, <BCLASS="COMMAND">column</B>, 和<BCLASS="COMMAND">expand</B>. </P><P><KBDCLASS="USERINPUT">pr -o 5 --width=65 fileZZZ | more</KBD> 这个命令对<TTCLASS="FILENAME">fileZZZ</TT>进行了比较好的分页, 并且打印到屏幕上. 文件的缩进被设置为5, 总宽度设置为65. </P><P>一个非常有用的选项<CODECLASS="OPTION">-d</CODE>, 强制隔行打印(与<BCLASS="COMMAND">sed -G</B>效果相同). </P></DD><DT><ANAME="GETTEXTREF"></A><BCLASS="COMMAND">gettext</B></DT><DD><P>GNU <BCLASS="COMMAND">gettext</B>包是专门用来将程序的输出翻译或者<AHREF="localization.html">本地化</A>为不同国家语言的工具集. 在最开始的时候仅仅支持C语言, 现在已经支持了相当数量的其它程序语言和脚本语言. </P><P>想要查看<BCLASS="COMMAND">gettext</B><EM>程序</EM>如何在shell脚本中使用. 请参考<TTCLASS="REPLACEABLE"><I>info页</I></TT>. </P></DD><DT><ANAME="MSGFMTREF"></A><BCLASS="COMMAND">msgfmt</B></DT><DD><P>一个产生二进制消息目录的程序. 这个命令主要用来<AHREF="localization.html">本地化</A>. </P></DD><DT><BCLASS="COMMAND">iconv</B></DT><DD><P>一个可以将文件转化为不同编码格式(字符集)的工具. 这个命令主要用来<AHREF="localization.html">本地化</A>. </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 # 将字符符串由UTF-8格式转换为UTF-16并且打印到BookList中 2 function write_utf8_string { 3 STRING=$1 4 BOOKLIST=$2 5 echo -n "$STRING" | iconv -f UTF8 -t UTF16 | cut -b 3- | tr -d \\n >> "$BOOKLIST" 6 } 7 8 # 来自于Peter Knowles的"booklistgen.sh"脚本 9 #+ 目的是把文件转换为Sony Librie格式. 10 # (http://booklistgensh.peterknowles.com)</PRE></FONT></TD></TR></TABLE> </P></DD><DT><BCLASS="COMMAND">recode</B></DT><DD><P>可以认为这个命令是上边<BCLASS="COMMAND">iconv</B>命令的专业版本. 这个非常灵活的并可以把整个文件都转换为不同编码格式的工具并不是Linux标准安装的一部分. </P></DD><DT><BCLASS="COMMAND">TeX</B>, <BCLASS="COMMAND">gs</B></DT><DD><P><BC
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?