我正在 tcsh 中编写一个简单的脚本(显然这是一个坏主意,但很好)来从文本文件中 grep 一些模式。假设我们有一个文件animal_names.txt
,其中包含:
dog carrot
dog bolt
cat larry
cat brownies
bird parry
bird pirate
Run Code Online (Sandbox Code Playgroud)
我写了脚本:
set animals = "dog\|cat"
set names = `grep $animals animal_names.txt`
echo "$names"
Run Code Online (Sandbox Code Playgroud)
目的是用“dog”或“cat”来grep所有行。但是,我得到的输出只是一行:
dog carrot dog bolt cat larry cat brownies
Run Code Online (Sandbox Code Playgroud)
不知何故,换行符在输出中被删除。有没有办法保留换行符?另一篇文章建议使用 :q 修饰符,但它在我的情况下不起作用。
“我得到的输出只有一行” - 不幸的是,您刚刚找到了脚本编写出现问题的原因之一[t]csh
。保留换行符要么是不可能的,要么是不平凡的。使用bash
( 或sh
) 代替。
假设这已写入文件find_animals
:
#!/bin/sh\nanimals=\'dog|cat\'\nnames=$(grep -E "$animals" animal_names.txt)\necho "$names"\n
Run Code Online (Sandbox Code Playgroud)\n请注意,我没有转义 RE|
符号,而是告诉我grep
使用扩展正则表达式 (ERE)。您可以按照原来的方式保留它,但我认为这种方式更容易阅读。
使脚本可执行
\nchmod a+x find_animals\n
Run Code Online (Sandbox Code Playgroud)\nanimal_names.txt
在可以找到文件的目录中运行它
./find_animals\n
Run Code Online (Sandbox Code Playgroud)\n输出
\ndog carrot\ndog bolt\ncat larry\ncat brownies\n
Run Code Online (Sandbox Code Playgroud)\n如果你坚持使用tcsh
这个会起作用:
#!/usr/bin/tcsh -f\nset animals = \'dog|cat\'\nset temp = "`grep -E \'$animals\' animal_names.txt`"\nset names = ""\nset nl = \'\\\n\'\nforeach i ( $temp:q )\n set names = $names:q$i:r:q$nl:q\nend\nset names = $names:r:q\necho $names:q\n
Run Code Online (Sandbox Code Playgroud)\n参考
\n