如何在文本文件中将特定行作为命令运行?


11

有时我需要执行一个位于Shell脚本中的命令。

我已经知道sed -n 'line_num p'可以打印该行。但是我怎样才能执行打印出特定行的命令呢?

Answers:


9

试试这个家伙=):

sed -n 'line_num p' | bash

要么

"$(sed -n 'line_num p')"

@mikeserv我有兴趣知道该陈述的背景以供我自己学习。
Bratchley

无需在line_num和之间放置空格p,例如,如果line_num是123,则可以sed -n 123p | bash。如果sh足够,请使用sh代替bash
janos 2015年

那么,sed -n 'line_num p' | sh可能是另一种解决方案吗?这有更多的兼容性吗?
2015年

1
@Zen-取决于脚本的目标外壳。它还取决于sh实际的外壳。在Debian (以及派生的)系统sh上通常是dash。是的,如果脚本是为dash (或以其他方式依赖于可移植语法)编写的,bash则是的,但是如果脚本是为编写的,则几乎肯定不是。
mikeserv

可以使用历史记录文件来完成此操作,以便如果我运行history并看到要运行900行,可以以某种方式运行900行吗?
codecowboy

3

如果以交互方式进行此操作,则可以将该行写入bash历史记录中:

history -s "$(sed -n 'line_num p')"

然后按Enter将行插入到readline缓冲区中并执行;这样一来,您就有机会瞥一眼生产线,以免为时已晚。


那很聪明,可能是一个很好的假设。
mikeserv

这个-s选项在这里意味着什么?我在man history
Zen

@zen:history是内置的,因此已在中进行了记录help history(或man bash,但这是很多读物)。引用以上内容,history -s将“将ARG作为单个条目添加到历史列表中”
rici 2015年

2

你可以做...

{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"

这将仅从$NUM脚本中的shell变量中获取该行$line,然后在当前shell中将其作为命令进行评估。

执行此操作的另一种方法可能类似于:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"

1
“ eval”是“ evil”的常见拼写错误。如果eval是答案,那么您肯定是在问错问题。参见mywiki.wooledge.org/BashFAQ/048
吉尔斯

1
对。每个人都爱eval
mikeserv

gnu sed带有e标志,这样类似的东西sed "${NUM}"'!d;s/^//e;q'也可以工作
don_crissti

2

您是否正在使用vim(在Linux上为vi)编辑脚本?在vi中添加映射:

:nmap <F4> Y:!<C-R>"<C-H><CR>

然后当您在vi中的有趣行上时,按F4


-2

在bash中,您可以运行以下命令:

for line in $(cat file.txt); do command $line; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.