我正在 tcsh 中编写一个简单的脚本(显然这是一个坏主意,但很好)来从文本文件中 grep 一些模式。假设我们有一个文件animal_names.txt
,其中包含:
dog carrot
dog bolt
cat larry
cat brownies
bird parry
bird pirate
我写了脚本:
set animals = "dog\|cat"
set names = `grep $animals animal_names.txt`
echo "$names"
目的是用“dog”或“cat”来grep所有行。但是,我得到的输出只是一行:
dog carrot dog bolt cat larry cat brownies
不知何故,换行符在输出中被删除。有没有办法保留换行符?其他邮政建议使用 :q 修饰符,但它在我的情况下不起作用。
答案1
”我得到的输出只是一行“ - 不幸的是,您刚刚遇到了脚本编写出现问题的原因之一[t]csh
。保留换行符要么是不可能的,要么是不平凡的。使用bash
( 或sh
) 代替。
假设这已写入文件find_animals
:
#!/bin/sh
animals='dog|cat'
names=$(grep -E "$animals" animal_names.txt)
echo "$names"
请注意,我没有转义 RE|
符号,而是告诉grep
我使用扩展正则表达式 (ERE)。你可以按照原来的方式保留它,但我认为这样更容易阅读。
使脚本可执行
chmod a+x find_animals
animal_names.txt
在可以找到文件的目录中运行它
./find_animals
输出
dog carrot
dog bolt
cat larry
cat brownies
如果你坚持使用tcsh
这个会起作用:
#!/usr/bin/tcsh -f
set animals = 'dog|cat'
set temp = "`grep -E '$animals' animal_names.txt`"
set names = ""
set nl = '\
'
foreach i ( $temp:q )
set names = $names:q$i:r:q$nl:q
end
set names = $names:r:q
echo $names:q
参考
- tcsh 在命令替换 `...` 中保留换行符(一个非常有效的解决方案)
- Csh 编程被认为是有害的
- 不使用 C shell 的十大理由