標準出力のN行目の番号にアクセスできますか?

標準出力のN行目の番号にアクセスできますか?

ファイルリストを出力するスクリプトを考えてみましょう。

$> bash someScript.sh
path/to/some/file
path/to/the/file/i/want/to/work/with
path/to/yet/another/file

2番目のファイルパスを別のコマンドに引数として渡したいと思いますvim。直接アクセスする方法はありますか?

必ずしも2番目のファイルにアクセスする必要はありませんが、次回は3番目または27番目のファイルにアクセスすることもできることを指摘したいと思います。できるだけ簡単にN行を選択できるようにしたいです。

マウスの選択を使用して中間クリックで挿入するか、タブの完成を使用してパスを入力します。今より簡単な方法があるかどうか疑問に思います。

私の解決策の問題は、すべてのスクリプトをこのように編集する必要があることです。どのようなコマンドfindでも使用できるこの問題に対するより一般的な解決策があれば興味深いでしょう。

答え1

確かに。

bash someScript.sh | sed -n '2 p'

出力をフィルタリングし、2行目だけを印刷します。次のパラメータで作成しますvim

vim "$(bash someScript.sh | sed -n '2 p')"

答え2

たとえば、出力の2行目にアクセスするには、headとtailを使用します。

bash someScript.sh | head -2 | tail -1

答え3

短い入力が最も重要で、ファイルがそれほど大きくない場合:

nth_line=$(sed -n ${n}p)
nth_line=$(sed $n\!d)

ファイルが長く、1行だけに興味がある場合は、sed必要な行を印刷して終了するか、tail前の行を削除してhead結果の最初の行を抽出します。

nth_line=$(sed -n -e "$n {" -e p -e q -e "}")
nth_line=$(tail -n +$n | head -n 1)

tail -n +$nラインn-1はスキップされました。つまり、出力はラインnから始まります。)

少数のラインでは、read埋め込みラインを使用できます。

IFS= read -r first_line; IFS= read -r second_line

すべての行を読むには、配列(ksh / bash / zshのみ)に配置できます。

IFS=$'\n'
lines=($(cat))
second_file="${lines[1]}"  # note that ksh/bash arrays start at 0

このコードを再利用可能にするには、関数に入れてください。

# Read at most MAX input lines (default: all) into the VAR array (default: ${lines[@]}).
# Usage: read_lines [VAR [MAX]]
read_lines () {
  typeset IFS=$'\n'
  if [ $# -eq 0 ]; then set lines; fi
  if [ -z "$2" ]; then eval "$1=(\$(cat))"; else eval "$1=(\$(head -n $2))"; fi
}

答え4

ちょっとしたハッキン​​グですが解決しました。 ;)

ファイルパスを出力するスクリプトは次のとおりです。

#!/bin/bash
rm /tmp/svn_filelist_to_source /tmp/svn_filelist
svn status | egrep 'M |A ' | cut -c9- > /tmp/svn_filelist
counter=1
cat /tmp/svn_filelist | while read -r path; do
  echo $path
  echo "file$counter=\"$path\"" >> /tmp/svn_filelist_to_source
  counter=$(($counter+1))
done;

これが私が実行する方法です。エイリアスに入れたようです。

sh statusAddedAndModified.sh && source /tmp/svn_filelist_to_source

これで、次のことができます。

svn commit $file2

関連情報