ファイルのリストを出力するスクリプトを想定します。
$> 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
。
承知しました。
bash someScript.sh | sed -n '2 p'
出力をフィルタリングし、その2行目を出力します。これをvim
のパラメータにするには:
vim "$(bash someScript.sh | sed -n '2 p')"
頭と尾を使用します。出力の2行目にアクセスします。
bash someScript.sh | head -2 | tail -1
タイプが短いことが最優先で、ファイルがそれほど大きくない場合:
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