2019一线城市文本

    技术2024-06-06  75

    大多数UNIX®开发人员都选择Emacs,vi或这两个文本编辑应用程序的许多变体,分支和克隆中的一种。 通常,在选择的编辑器中打开文件,并且更改是由交互操作者指定的,并由操作员应用于文件。

    但是您通常可以比在文本编辑器中打开文件更快地在命令行上执行编辑工作。 可以从命令行对复杂的编辑过程进行编程和指定,并在多个文件中执行,从而消除了所有不必要的屏幕显示,光标移动以及与文件的手动交互。 一个好的策略是保留相关单线的缓存以进行常见的编辑工作。 它们不仅可以节省您的时间,尤其是在涉及多个文件的批处理操作中,还可以在脚本中使用它们。

    在Perl和AWK(以及最近的Ruby)语言中,当然还有在Shell中,用于编辑和处理文本的单行代码是一种著名的传统。 本文演示了使用三种最主要的命令行编辑工具在所有系统上都可以使用的基本文本编辑技术: cat , ed和sed 。 接下来的编辑示例从最简单,最常见的构造开始,直到最复杂的构造。

    与猫一起编辑

    使用cat (其名称一起代表)来连接文件和标准输入流,如清单1所示 。 懒散的人也将其用作一般的传呼机( cat file )和完整的文本编辑环境( cat > file )。 它的语法在简单性方面无与伦比,对于单行文本编辑,它为您提供了无需编辑器即可追加或插入文本的快速方法。

    清单1.使用cat连接文件和标准输入流
    $ (cat - input1 - input2 - input3 - input4) | mailx ted Ted, Take a look at these example files. This is the first file ... Ctrl-D This is the second file ... Ctrl-D This is the third file -- note the fourth paragraph below ... Ctrl-D And here's the last file ... Ctrl-D $

    在文件末尾添加文本

    不过,懒散的人在做某事。 当您需要在文件末尾附加文本时,没有比cat更快的了:

    $ cat >> file > line > line > lineCtrl-D $

    添加行时,按Ctrl-U会删除当前行, 按Ctrl-Z会暂停该过程,而按Ctrl-C会中止所有操作。 完成后,单独按Ctrl-D 。 (这些是一些默认的Korn Shell控制键,但它们适用于大多数Shell和编辑模式。)

    如果您要输入的数据是要从另一个窗口粘贴的X选择,则使用这种单行代码通常比调用编辑器,打开目标文件,移至文件末尾,粘贴文件要快。选择,保存文件并退出编辑器。 当您粘贴格式化或特殊格式化的文本时,由于某些文本编辑器和编辑模式在粘贴X选项时会重新格式化X选项,因此在保留格式或保留特殊格式的文本时,它也可能更为有用。

    尽管此操作是日常的日常操作,但您始终必须小心使用shell运算符来添加重定向( >> ),而不是常规重定向符( > ); 如果错误地使用了后者,则将用您要附加的文本覆盖文件的内容。

    要将一个文件的全部内容添加到另一个文件的末尾,请提供文件名:

    $ cat footnotes.txt >> file

    如果仅附加一行而不是多行或整个文件,则可以使用echo代替cat :

    $ echo "192.255.255.255 bigblue" >> /etc/hosts

    要附加从1开始逐项列出的文本行,请使用cat的-n选项; 每行前面都带有行号(最多可包含五个空格字符)和一个制表符。 添加-b选项以禁止空行编号:

    $ cat -nb > fileThis line is numberedAnd so is thisAnother numbered lineCtrl-D $ cat file 1 This line is numbered 2 And so is this 3 Another numbered line $

    在文件开头插入文本

    通过使用连字符( - )指定标准输入并写入新文件,可以将文本插入cat文件的开头。

    $ cat - file > newfile This is the beginning of the file And then the old file is inserted Below this line: $

    尽管很简单,但是这种单行代码的缺点是它会创建一个新文件。 如果要在原始文件中插入文本,则必须执行重命名改组操作,这几乎比其价值更大。 ed即将推出更好的方法。

    显示非打印字符

    cat有几个有用的选择。 其中一些控制输出非打印字符的方式,例如制表符和控制字符。 要确定文件或一组文本文件是否具有嵌入的控制字符,请使用以下选项。 例如,如果文件末尾有空格,则可以看到它们:

    $ cat -vet input.txt This line has trailing blanks. $ This line does not.$ $

    这些选项根据您的UNIX实现而有所不同。 表1给出了标准的IBMAIX®操作系统选项。

    表1. AIX cat的输出控制选项
    选项 描述 -b 不要为空行编号。 -e 用$字符显示行尾。 -n 对输出的所有行编号,从1开始。 -q 使用安静的操作(禁止显示错误消息)。 -r 用单行替换所有多条空行(“挤压”空白)。 -S 将多条空行一起压缩成一行(与-r相同)。 -s 禁止显示错误消息(安静的操作)。 -t 将制表符显示为^I -u 不要缓冲输出。 -v 可见地显示非打印控制字符。

    用ed编辑

    顾名思义,行编辑器ed对输入文件的行进行编辑。 它将整个文件读入其自己的缓冲区,对该副本执行指定的操作,并有选择地将缓冲区写入磁盘。 您可以在编辑操作中指定任意数量的行,并且这些操作可以组合并按顺序给出。 这些事实使ed成为在脚本中使用的绝佳选择。 指定此格式的操作:

    [address]command [text]

    地址指定要处理的一行或多行(默认为当前行),并且可以通过多种方式指定。 单字符命令是在指定行上执行的操作。 对于脚本中的临时单行代码,可通过将一组命令和文本通过管道传递给echo来非交互地使用ed :

    ( echo 'OPERATION'; echo 'OPERATION'; ... echo 'wq' ) | ed -s FILENAME

    如果在操作中输入了文本,则应回显句点( . )以指示输入结束。 最后的wq写入文件并退出。 -s选项使ed安静,并禁止所有正常输出。

    幸运的是, ed的基本寻址方法和命令已经相当标准化。 表2中描述了寻址的主要形式。 表3给出了命令。

    表2. ed地址行
    选项 描述 . 此选项寻址当前行(默认地址)。 number 此选项处理行号 。 行可能是一个范围内的地址,以逗号( first , last )分隔。 0指向缓冲区的开头(在第一行之前)。 - number 此选项处理当前行之前的行号行。 如果不使用number ,则减号将指向当前行之前的行。 + number 此选项解决当前行之后的行号行。 如果没有number ,则加号将在当前行之后立即寻址该行。 $ 此选项处理最后一行。 , 此选项处理第一行到最后一行,包括首尾(包括1,$ )。 ; 此选项通过最后一行寻址当前行。 / pattern / 此选项处理包含与pattern匹配的文本的下一行。 ? pattern ? 此选项处理包含匹配pattern的文本的前一行。
    表3.主要的ed命令
    命令 描述 a 此命令在指定的地址后追加文本。 c 此命令将指定的地址更改为给定的文本。 d 此命令删除寻址的行。 i 此命令在指定地址之前插入文本。 q 只要缓冲区保存到磁盘,此命令就退出程序并退出。 r file 此命令读取filespec的内容并将其插入指定的地址之后。 s/ pattern / replacement / 此命令用pattern匹配的文本替换指定地址中的替换文本。 w file 此命令将指定的地址写入file 。 如果没有地址,此命令将使用整个缓冲区的默认值。

    在文件开头插入文本,取两个

    您可以使用可编写脚本的ed -liner轻松地在文件开头插入文本。 插入是通过ed将给定文本附加到第0行(文件的开头),并使用a命令:

    $ cat file This is the end. $ (echo '0a'; echo 'This is the beginning.'; echo '.'; echo 'wq') | ed -s file $ cat file This is the beginning. This is the end. $

    您可以交互地执行相同的操作:

    $ cat file This is the end. $ ed -s file > 0a > This is the beginning. > . > wq $ cat file This is the beginning. This is the end. $

    要将另一个文件的内容插入文件的开头,请使用r命令:

    $ (echo '0r headnotes'; echo 'wq') | ed file

    在给定的字符串后插入文本

    您可以使用ed在文件中的任何行之前或之后插入任意行的文本。 要在包含给定字符串的第一行之后插入,请将该字符串括在斜杠中,并在其后加上a命令以附加后面的文本。 和以前一样,以句点结尾,并使用wq写入文件并退出。

    当您要在文件的特定位置附加文本块时,此技术非常有用:

    $ ( echo '/begin/a'; echo 'This is the middle.'; \ > echo '.'; echo 'wq') | ed -s file $ cat file This is the beginning. This is the middle. This is the end. $

    在将多行文本插入到一组文件中时,它也很有用。 如果要插入很多行,请使用here文档 ,这是一个用<< <<和一个限制字符串内联指定的文档,重定向它之后的所有输入,直到达到限制字符串为止(请参阅参考资料 ):

    $ for i in *.xml > { ed -s $i << EOF > /<records>/a \ > <record> \ > <name>johnnycomelately</name> \ > <step>10</step> \ > <dur>4</dur> \ > </record>\ > . > wq > EOF > } $

    您可以在给定的字符串后插入文件:

    $ (echo '/END OF PART I/r footnotes.txt'; echo 'wq') | ed file

    删除行

    使用d命令从文件中删除行。 与此处讨论的所有命令一样,您可以指定任何种类的有效地址 ,例如特定行或行范围。 实际上,与至少一个匹配的模式结合使用时,此单线通常最有用,例如删除以第一行开头的行将某些模式匹配到文件末尾:

    $ ( echo '/FOOTNOTES/,$/d'; echo 'wq' ) | ed -s file

    您可以进行反操作并删除文件第一行中的所有内容,直到第一行与某些模式匹配为止:

    $ ( echo '1,/\.\.\./d'; echo 'wq' ) | ed -s file

    删除尾随的空白

    您可以使用s命令并替换为null来从文件中删除尾随空白:

    $ cat -vet input.txt This line has trailing blanks. $ This line does not.$ $ (echo ',s/ *$//'; echo 'wq') | ed -s input.txt $ cat -vet input.txt This line has trailing blanks.$ This line does not.$ $

    用sed编辑

    sed (Stream EDitor)是这里讨论的最复杂,功能最强大的编辑工具。 它是一个文本编辑器,但是与ed文件编辑器不同,它可以编辑输入流并写入输出流。 因此,这对于编辑命令输出或使用其他工具预处理文件时很有用-然后可以将文本输出直接管道传输到sed ,以进行快速编辑。 但是sed也可以在文件上运行,并且其脚本语言具有高级模式匹配功能,因此它是执行任何类型的快速文本编辑(例如在一组文件中进行快速搜索和替换)的理想选择。 实际上,它是用于文本编辑操作的最流行的命令行工具之一。

    sed使用任意数量的命令脚本,后跟可选的输入文件规范; 默认情况下,它读取标准输入。 某些版本的sed具有-i选项,该选项指定应编辑输入文件。 (没有此选项,则从中读取输入文件,但不会写入。)如果您安装的版本支持此选项,则应使用它-它使您可以使用单个命令对任何给定的文件规范执行快速编辑操作:

    sed -i script filespec

    以下示例假定您的sed具有-i 。 否则,您必须使用shell重定向进行临时文件混洗,以将输出保存到新文件,并在另一步骤中将新文件重命名为旧文件:

    sed script file > newfile; mv newfile file

    对于多个文件,则必须循环:

    for i in *; { sed script $i > $i.new; mv $i.new $i; }

    替换文件中的文本

    您可以使用s / searchstring / replacestring /构造将给定的字符串替换为另一个。 要替换文件中每行上第一次出现的old ,请使用以下命令:

    $ sed -i 's/old/new/' file

    要替换所有出现的内容,请将g附加到搜索中。 此技术非常适合解决打字错误或替换文件或文件组中重复出现的单词,词组或其他字符串的情况:

    $ sed -i 's/Esclipse/Eclipse/g' *.xml

    您可以在输入表达式中将字符括起来,但是,如果在替换文本中使用括号,则会将它们视为常规字符:

    $ cat file This is the beginning. This is the middle. This is the end. $ sed 's/[Tt]h/[Tt]h/g' file [Tt]his is [Tt]he beginning. [Tt]his is [Tt]he middle. [Tt]his is [Tt]he end.

    当斜杠字符是要搜索或替换的短语的一部分时,请使用新的分隔符来定义它:

    $ sed -i 's,/usr/local/websphere,/usr/websphere,' file

    您还可以用一些新文本替换包含模式的整行:

    $ sed -i 's/.*pattern.*/LINE DELETED/' file

    编辑匹配的图案

    回想一下将字符按模式分组在一起的方括号的示例,以及如何将它们当作替换文本中的文字字符。 如果要在替换文本中包含文字匹配的模式怎么办? 您可以使用&号( & )进行此操作。 通过在文本之前或之后放置文本,此方法对于编辑匹配的模式很有用:

    $ cat file This is the beginning. This is the middle. This is the end. $ sed 's/[Tt]h/>&</g' file >Th<is is >th<e beginning. >Th<is is >th<e middle. >Th<is is >th<e end.

    在匹配的模式后插入文本

    使用a命令在给定的匹配模式之后添加一行文本:

    $ sed -i '/pattern/a text' file

    这不会替换与模式匹配的文本-只会在包含该模式的第一行之后添加文本。

    在行首插入文本

    要在每行的开头插入文本,请匹配插入号元字符并提供要插入的文本。 这是将电子邮件样式引号添加到文件中所有行的方法:

    $ sed 's/^/> /' input.txt > This line has trailing blanks. > This line does not. $

    在行尾插入文字

    在每一行的末尾插入文本也适用相同的原则-匹配美元符号元字符并提供要插入的文本。 这是模拟AIX cat的-vet选项以标记尾随空格的方法:

    $ sed 's/$/$/' file This line has trailing blanks. $ This line does not.$ $

    删除文件中的行

    d命令删除给定的行。 您可以在其前面加上要匹配的行号,范围,模式或用斜杠括起来。

    要删除文件的第一行:

    $ sed -i 1d file

    要删除第1至10行:

    $ sed -i 1,10d file

    要删除“ BEGIN QUOTE”字符串的第一个实例与“ END QUOTE”字符串的第一个实例之间的所有行:

    $ sed -i '/BEGIN QUOTE/,/END QUOTE/d' file

    要删除当前目录中所有扩展名为.xml的文件中第一行包含“ <record>”而最后一行包含“ </ record>”的文本的所有部分:

    $ sed -i '/<record>/,/<\/record>/d' *.xml

    要从第一行删除到第一空白行:

    $ sed -i '/^> /d' file

    (当用于电子邮件或Usenet文章时,前面的单行剥离所有标头。)

    要删除所有以电子邮件样式引号开头的行:

    $ sed -i /^$/d file

    要删除文件的最后一行:

    $ sed -i '$d' file

    删除尾随空格

    如果文件的行包含需要清理的尾随空格字符,则在文本编辑器中手动查找并编辑它们会很麻烦-但是使用sed ,这样做是一种快速的单行操作。 您搜索在行尾之前出现一次或多次的文字空格字符,并将其替换为空集:

    $ cat -vet input.txt This line has trailing blanks. $ This line does not.$ $ sed -i 's/ *$//' input.txt $ cat -vet input.txt This line has trailing blanks.$ This line does not.$ $

    摘要

    通过从UNIX命令行运行单行代码,无需编辑器,就可以用重要且复杂的方式编辑文本文件。 您有很多理由这样做:出于速度和便利性的考虑,为了在无法或不希望进行交互式编辑的情况下实现脚本化,有时对单个文件或一组文件进行复杂的编辑,而这样做可能会在您的交互式应用程序中很难甚至不可能完成。 本文通过使用三种最普遍使用的编辑工具: cat , ed和sed ,通过许多简单的文本编辑单行代码演示了这一概念。


    翻译自: https://www.ibm.com/developerworks/aix/library/au-textedit.html

    相关资源:微信小程序源码-合集6.rar
    Processed: 0.012, SQL: 10