因此,我目前正在尝试对上一系统管理员传下来的一批脚本进行逆向工程。
其中一个 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\n
为Dcom.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
这将导致它不再尝试。无论是否发生替换,都会打印每一行。
这确实不是将整个文件存储在内存中。