![如何忽略被重定向的特定线路](https://linux22.com/image/175819/%E5%A6%82%E4%BD%95%E5%BF%BD%E7%95%A5%E8%A2%AB%E9%87%8D%E5%AE%9A%E5%90%91%E7%9A%84%E7%89%B9%E5%AE%9A%E7%BA%BF%E8%B7%AF.png)
我有一个程序,可以通过重定向从输入文件中向其提供一些指令来运行该程序。我的输入文件如下所示:
alpha
5
2
run
7
quit
现在,我像这样运行它:
myprogram < input_file
但是,有时我需要在输入文件中添加一些注释以使其清楚,例如
# The name of value
alpha
# The acceleration
5
# The distance
2
run
7
quit
不幸的是,现在我无法将其重定向到程序,因为它不会忽略以#
在将其重定向到之前如何忽略这些注释行myprgram
?
答案1
您可以使用grep
过滤掉以“#”开头的行:
grep -v '^#' input_file | myprogram
传递给的字符串grep
是正则表达式。它匹配行 ( ) 的开头,^
后跟#
。-v
反转逻辑,以便显示与此模式不匹配的行。
一般来说,如果我想修改行内的数据,我会选择grep
简单地显示/丢弃整行。sed
当然,该sed
解决方案也有效。
答案2
在将其提供给程序之前,使用 sed 过滤掉带有注释的行。您可以选择其中一种形式(但并非所有 shell 都支持第二种形式,即进程替换):
sed '/^#/d' input_file | myprogram
myprogram < <(sed '/^#/d' input_file)
/^#/
是匹配以 开头的任何行的正则表达式#
,d
是从输出中删除这些行的命令。 (不用担心,input_file
不会被修改sed
)。