假设一个输出文件列表的脚本:
$> bash someScript.sh
path/to/some/file
path/to/the/file/i/want/to/work/with
path/to/yet/another/file
现在我想将第二个文件路径作为另一个命令的参数,例如vim
.有没有办法直接访问呢?
我想指出的是,我不一定要访问第二个文件,但下次可能会访问第三个或第 27 个文件。我希望能够尽可能轻松地选择第 N 行。
现在,我使用鼠标选择并通过中键单击插入或使用制表符完成输入路径。现在我想知道是否有更简单的方法。
我自己的解决方案的问题是,我必须以这种方式编辑所有脚本。如果这个问题有一个更通用的解决方案,可以使用任何类型的命令,例如 ,那就很有趣了find
。
答案1
当然。
bash someScript.sh | sed -n '2 p'
将过滤您的输出并仅打印它的第二行。使其成为以下参数vim
:
vim "$(bash someScript.sh | sed -n '2 p')"
答案2
使用 head 和 tail,例如访问输出的第二行:
bash someScript.sh | head -2 | tail -1
答案3
如果输入简短是最重要的并且文件不是很大:
nth_line=$(sed -n ${n}p)
nth_line=$(sed $n\!d)
如果文件很长并且您只对一行感兴趣,请使用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