是否可以在sed里面运行命令sed,像这样:
sed -i.bak -e '${sed -n 1,1p file.txt},$d' output.file
Run Code Online (Sandbox Code Playgroud)
我希望第一行file.txt是 number 的输入参数,用于output.file删除该行之后的所有行。
这不是sed里面的命令sed,这只是你的 shell 在实际 caling 之前所做的替换sed。只需使用正确的引用和括号,就完成了:
sed -i.bak -e "$(sed -n 1,1p file.txt),\$d" output.file
Run Code Online (Sandbox Code Playgroud)
双引号允许在内部进行进程替换(单引号不允许),$()语法意味着捕获并替换内部命令的结果。请注意,\$必须对其进行转义以防止$d被解释为变量。
编写相同内容的一种不那么令人困惑的方式是
n=$(sed -n 1,1p file.txt)
sed -i.bak -e "${n}\$d" output.file
Run Code Online (Sandbox Code Playgroud)
你也可以把它写像"${n}"',$d',在bash您可以连接differenlty引用的字符串(包括无引号字符串)只需将它们放在一个挨着另一个。
此外,您可能想要编写sed -n '1{p;q}' file.txt. 首先,如果只指定一个行号,则不必写范围。其次,如果您在打印第一行 ( q)后退出,它不会无缘无故地读取整个文件 - 效率更高。因为是第一行,-n也可以省略。或者,您可以使用head -n1 file.txt.