web-dev-qa-db-ja.com

標準出力の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

9
k0pernikus

承知しました。

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

出力をフィルタリングし、その2行目を出力します。これをvimのパラメータにするには:

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

頭と尾を使用します。出力の2行目にアクセスします。

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

タイプが短いことが最優先で、ファイルがそれほど大きくない場合:

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
}

それは少しハックですが私はそれを解決しました;)

これがファイルパスを出力するスクリプトです。

#!/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

0
k0pernikus