我可以访问标准输出的第 N 行号吗?

我可以访问标准输出的第 N 行号吗?

假设一个输出文件列表的脚本:

$> 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

相关内容