tcsh 脚本 - 保留 grep 结果的换行符

Han*_*anz 2 grep tcsh

我正在 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 修饰符,但它在我的情况下不起作用。

roa*_*ima 5

我得到的输出只有一行” - 不幸的是,您刚刚找到了脚本编写出现问题的原因之一[t]csh。保留换行符要么是不可能的,要么是不平凡的。使用bash( 或sh) 代替。

\n

假设这已写入文件find_animals

\n
#!/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)。您可以按照原来的方式保留它,但我认为这种方式更容易阅读。

\n

使脚本可执行

\n
chmod a+x find_animals\n
Run Code Online (Sandbox Code Playgroud)\n

animal_names.txt在可以找到文件的目录中运行它

\n
./find_animals\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
dog carrot\ndog bolt\ncat larry\ncat brownies\n
Run Code Online (Sandbox Code Playgroud)\n

如果你坚持使用tcsh这个会起作用:

\n
#!/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\n