![这个 sed 命令是如何工作的?](https://linux22.com/image/25534/%E8%BF%99%E4%B8%AA%20sed%20%E5%91%BD%E4%BB%A4%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84%EF%BC%9F.png)
我想了解以下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
)并打印它