Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash上逐行读取文件;包含另一个unqiue文件路径的每一行_Bash_Shell_Vim - Fatal编程技术网

在bash上逐行读取文件;包含另一个unqiue文件路径的每一行

在bash上逐行读取文件;包含另一个unqiue文件路径的每一行,bash,shell,vim,Bash,Shell,Vim,给定文件“a.txt”中的每一行都包含指向另一个唯一文件的目录/路径。假设我们要逐行解析'a.txt',以字符串格式提取路径,然后使用vim之类的工具在此路径上处理文件,依此类推 在完成这个线程之后,我编写了以下脚本,在bash上说“openfile.sh”(我是新手) 问题在于,尽管$line正确指定了新文件的路径,但当vim打开文件时,vim会继续接收“a.txt”中包含的文本作为命令。如何编写一个脚本,以便正确地从“a.txt”获取路径,使用vim打开它,然后继续解析“a.txt”中的其余

给定文件“a.txt”中的每一行都包含指向另一个唯一文件的目录/路径。假设我们要逐行解析'a.txt',以字符串格式提取路径,然后使用vim之类的工具在此路径上处理文件,依此类推

在完成这个线程之后,我编写了以下脚本,在bash上说“openfile.sh”(我是新手)

问题在于,尽管$line正确指定了新文件的路径,但当vim打开文件时,vim会继续接收“a.txt”中包含的文本作为命令。如何编写一个脚本,以便正确地从“a.txt”获取路径,使用vim打开它,然后继续解析“a.txt”中的其余行?

替换:

vim -c ":q" -cq $line
与:


vim-c:q“-cq”$line”虽然我不确定您的最终目标,但这个shell命令将在
a.txt中每行执行一次vim:

xargs-o-n1 vim-c:q'

正如在的评论中所解释的,您遇到的问题是由于vim是一个交互式程序,因此继续从
$line

读取输入。问题在您基于脚本的答案下

vim
正在消耗
stdin
,该数据由
done
提供给循环。我们可以在以下示例中观察到相同的行为:

$ while read i; do cat; done < <(seq 3)
2
3

xargs
将对
$1

给定的文件中的每一行执行
vim
一次
xargs-o
在我的
GNU findutils 4.7.0
中不可用。从
manxargs
看来
-o
是BSD特有的。Quote:
xargs sh-c'emacs“$@”
[…]此示例实现了与BSD的-o选项相同的效果,但以更灵活和可移植的方式实现。值得注意的是,它很有趣。我还在Ubuntu上使用
GNU findutils 4.7.0
,手册页上说添加
-o
是为了更好地与BSD兼容。这很奇怪。完整版本为
xargs(GNU-findutils)4.7.0-git
版权所有(C)2016[…]
。我在Windows Linux子系统(WSL)中使用Ubuntu16.04.3 LTS。当我尝试执行命令时,我得到了
xargs:invalid选项--'o'
。我在Ubuntu 18.04上,所以我猜他们是最近添加的。啊,是的,答案在注释中。我将查看您提到的其他工具。
vim -c ":q" -cq $line
vim -c ":q" -cq "$line" </dev/tty
$ while read i; do cat; done < <(seq 3)
2
3
< "$1" xargs -d\\n -n1 vim -c :q -cq