2

我正在分析一个批处理文件,其中有一行是它编辑一个文本文件(输入)并制作一个 txt 文件(输出)。

该批次正在使用三个帮助工具.exe grepsedcut. 我试图阅读他们的使用手册,但这并不容易。

该行是:

type input.txt | sed "s#""#'#g" | grep -o "class='name[^>]*" | sed -n "/id=/p" | grep -o "surname=[^>]*" | cut -d"'" -f2 >output.txt

我想知道这条线是如何解释的?都有些什么样的规矩?有没有更聪明的方法(例如使用一个工具而不是全部三个)?

4

3 回答 3

4

尽管它涵盖了您所问的大部分内容,但我将添加到 jeb 的答案中。
这三个命令是从 Linux 移植的模拟命令,它们执行以下操作:

  1. sed:用于过滤和转换文本的流编辑器。
  2. grep:用于打印与图案匹配的线条的工具。
  3. cut: 用于剪切文件每一行的选定部分的工具。

我建议您通过man <command name>在 Linux 中键入或在谷歌上搜索相同的字符串(例如,“ man grep ”)来了解更多关于这三个命令的信息。
另外,查找正则表达式。尽管对于初学者来说它们通常不清楚,但它们是表示模式的一种常见且紧凑的方式。

关于问题中的具体用法:

sed "s#""#'#g"

对于每一行,这会将所有引号 ( "") 替换为撇号 ( ')。

grep -o "class='name[^>]*"

这仅打印以 开头class='name但没有以下内容的行的一部分>

sed -n "/id=/p"

默认情况下,Sed 打印每一行。另一方面,sed -n "<some pattern> /p"仅打印与指定模式匹配的行。在这种情况下,Sed 只打印包含id=.

grep -o "surname=[^>]*"

这仅打印以 开头surname=name'但没有以下内容的行的一部分>

cut -d"'" -f2

这会将每一行解析为由撇号 ( ) 分隔的连续字段',并选择第二个。

一切都是管道式的,这意味着每个命令的输出都用作右侧下一个命令的输入。“input.txt”的内容被输入到 Sed 命令中,然后它的输出被输入到 grep 命令中,依此类推。最终输出显然会打印到一个名为“output.txt”的新文件中。

是的,就像 jeb 提到的那样,这看起来是一个尴尬的解决方案,因为这里的所有事情都可以单独完成sed,大概只需要一两个命令。

于 2012-06-20T15:04:43.070 回答
2

这或多或少很容易。

将其拆分为单个命令:

sed "s#""#'#g"相当于sed "s/""/'/g",它将用一个'字符替换每个引号。

grep -o "class='name[^>]*"将仅捕获带有文本的行,class='name并且-o开关应在输出前加上STDIN:(不知道为什么这应该有用)。

sed -n "/id=/p"只会捕获包含 text 的行id=

grep -o "surname=[^>]*"将仅捕获带有 text 的行surname=

cut -d"'" -f2将线切割成部分,这些部分由'( -d') 分隔,您将获得第二个字段 ( -f2)

是的,这看起来像是一个快速破解解决方案,这可以单独使用 sed 解决。
特别是当单个文本的顺序是固定顺序时,例如:
<class="name17" id=13> <surname=Frank>

于 2012-06-20T14:58:13.857 回答
0

该| 字符是管道字符。它用于将一个命令的输出通过管道传输到另一个命令的输入。

> 字符是重定向字符。它将标准输出重定向到文件。

因此,在您的示例中,该过程从type命令开始:

type input.txt

这会将input.txt发送到标准输出,然后通过管道传输到下一个命令的输入:

sed "s#""#'#g"

通过其他管道grepsed命令以此类推。

最后的cut命令使用 > 字符将其输出重定向到output.txt文件。

cut -d"'" -f2 >output.txt
于 2012-06-20T12:13:40.667 回答