ファイルリストを出力するスクリプトを考えてみましょう。
$> 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