在bash上逐行读取文件;包含另一个unqiue文件路径的每一行
给定文件“a.txt”中的每一行都包含指向另一个唯一文件的目录/路径。假设我们要逐行解析'a.txt',以字符串格式提取路径,然后使用vim之类的工具在此路径上处理文件,依此类推 在完成这个线程之后,我编写了以下脚本,在bash上说“openfile.sh”(我是新手) 问题在于,尽管$line正确指定了新文件的路径,但当vim打开文件时,vim会继续接收“a.txt”中包含的文本作为命令。如何编写一个脚本,以便正确地从“a.txt”获取路径,使用vim打开它,然后继续解析“a.txt”中的其余行?替换:在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”中的其余
vim -c ":q" -cq $line
与:
vim-c:q“-cq”$line”虽然我不确定您的最终目标,但这个shell命令将在a.txt中每行执行一次vim:
xargs-o-n1 vim-c:q'
正如在的评论中所解释的,您遇到的问题是由于vim是一个交互式程序,因此继续从$line
读取输入。问题在您基于脚本的答案下
vim
正在消耗stdin
,该数据由done1
提供给循环。我们可以在以下示例中观察到相同的行为:
$ 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