Sed/RegEx - 理解语句

Sed/RegEx - 理解语句

因此,我目前正在尝试对上一系统管理员传下来的一批脚本进行逆向工程。

其中一个 shell 脚本中有一行我(我一生)无法理解的内容。这里是:-

sed -n 'H;${x;s/^\n//;s/-jar\n/Dcom.sun.management.jmxremote.ssl=false\n&/;p;}' "$File"

GNU Bash 4.2.46(2) RHEL6 64 位。

答案1

该命令需要 GNU sed,并且似乎在行尾Dcom.sun.management.jmxremote.ssl=false第一次出现之前插入字符串,后跟换行符。-jar

例子:

something
something
something-jar
something

被转化为

something
something
somethingDcom.sun.management.jmxremote.ssl=false
-jar
something

sed命令通过运行文件的每一行将整个文件读入内存H(将当前行附加到“保留空间”中,并在开头添加换行符)。当它到达最后一行 ( $) 时,它将保留空间与模式空间 ( x) 交换并删除第一个换行符(通过运行H文件的第一行来放置在那里)。然后它替换-jar\nDcom.sun.management.jmxremote.ssl=false\n-jar\n(the&是与表达式匹配的任何内容)。然后打印收集的行 ( p)。

做同样事情的另一种方法awk

awk 'skip==0 && sub("-jar$", "Dcom.sun.management.jmxremote.ssl=false\n-jar") { skip=1 } { print }' "$File"

这会尝试在每一行上进行相同的替换,并且当它成功时,它会设置skip=1这将导致它不再尝试。无论是否发生替换,都会打印每一行。

这确实不是将整个文件存储在内存中。

相关内容