テキストファイルのコマンドとして特定の行を実行するにはどうすればよいですか?


11

時々私はシェルスクリプトにある単一のコマンドを実行する必要があります。

私はすでにsed -n 'line_num p'その行を印刷できることを知っています。しかし、どのようにして特定の行をコマンドとして出力したのですか?

回答:


9

この男を試してください=):

sed -n 'line_num p' | bash

または

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

@mikeserv私は自分の教育についてそのステートメントのコンテキストを知ることに興味があります。
Bratchley、2015年

line_numとの間にスペースを入れる必要はありません。pたとえば、line_num123の場合は、できsed -n 123p | bashます。そして、sh十分であれば、のsh代わりに使用しますbash
janos

では、sed -n 'line_num p' | sh別の解決策になるでしょうか?これはもっと互換性がありますか?
Zen

1
@Zen-これは、スクリプトの対象となるシェルによって異なります。また、シェルがsh実際に何であるかにも依存します。Debian (および派生)システムでshは通常dashです。スクリプトが記述されている場合dash (または移植可能な構文に依存している場合)、おそらくそうですが、記述されているbash場合はほぼ間違いなくそうです。
mikeserv、2015年

これを履歴ファイルで実行できるので、history実行して900行目を実行したい場合は、900行目を実行できますか?
codecowboy 2015

3

これをインタラクティブに行う場合は、bashの履歴に次の行を書き込むことができます。

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

次に、を押しEnterて行をreadlineバッファーに挿入し、実行します。手遅れになる前に、一目でラインを確認できます。


それはかなり賢く、おそらく良い仮定です。
mikeserv 2015年

この-sオプションはどういう意味ですか?説明が見つかりませんman history
Zen

@zen:historyは組み込みなので、ドキュメント化されていますhelp history(またはman bash、しかしそれはたくさんの読み物です)。上記を引用するhistory -sと、「ARGを単一のエントリとして履歴リストに追加する」
rici

2

できるよ...

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

これは$NUM、シェル変数のスクリプトから行のみを取得$lineし、現在のシェルでコマンドとして評価します。

これを行う別の方法は次のようになります。

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

1
「eval」は「evil」の一般的なスペルミスです。evalが答えなら、きっとあなたは間違った質問をしているでしょう。mywiki.wooledge.org/BashFAQ/048を
Gilles Quenot

1
うん。みんな大好きevalです。
mikeserv 2015年

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.