这个 sed 命令是如何工作的?

这个 sed 命令是如何工作的?

我想了解以下sed命令是如何工作的:

sed -nre "/jar$/ { x; d; }; /class$/ { x; p; }

实际上,它是另一个命令的一部分,用于从给定的 jar 文件列表中查找特定的类文件:

find . -name "*jar" -print -exec jar -tf '{}' \; | grep -E "jar$|CLASS_NAME" | sed -nre "/jar$/ { x; d; }; /class$/ { x; p; } "

答案1

首先,让我们从命令行选项开始:

  • -n禁用缓冲区的正常输出。仅打印请求打印的行(例如使用p命令)

  • -r启用扩展正则表达式

  • -e当我们在命令行中而不是从文件中指定 sed 命令时,实际上并不需要

现在是 sed 命令。有两个,按;性格分开。 Sed 逐行执行并按顺序执行这两个命令。但前提是它们匹配。在这里,两个命令都带有前缀,/SOMETHING/这意味着仅当当前行与正则表达式匹配时才执行该命令SOMETHING

/jar$/regexp 仅匹配当前行以jar.类似的/class$/正则表达式仅匹配当前行以class.现在,如果特定行匹配,它将执行其中的两个命令(它们用 分组{}) - 第一种情况是x,然后是d命令。在第二种情况下,它是x然后p命令。

  • x命令是eXchange.sed有一个缓冲区,可用于存储一些行。该命令将此缓冲区与当前行交换(因此当前行进入此缓冲区,缓冲区内容成为当前行)。

  • d命令丢弃当前行,读取新行并从第一行开始执行 sed 命令(d当前行忽略之后的所有命令)。

  • p命令打印当前行。由于我们使用-n命令参数,因此只有打印的行p才会显示在输出中。

总结一下:

  • /jar$/ { x; d; }表示 - 如果当前行以 结尾jar,则将其保存在缓冲区中

  • /class$/ { x; p; }意味着 - 如果当前行以 结尾class,则获取缓冲区内容(应包含以 结尾的最后一行jar,除非已经存在以 结尾的文件class)并打印它

相关内容