[英]How to make any sed, awk, and grep command ignore lines beginning with #?
我有一个包含各种各样的sed
, awk
和grep
命令的脚本,唯一的相似之处是它们每个都接收一个输入文件,对其进行编辑,然后将其发送到输出文件。 以下是一些基本示例:
sed "/^word$/d" input.txt > output.txt
grep "word" input.txt > output.txt
awk 'sub(/.*{/,"")' RS='}' input.txt > output.txt
我需要编辑所有脚本,以便它们将始终忽略通过在行的开头放置#
来注释掉的任何行。 是否有一个单一的解决方案,例如使用管道来获取任何类型的sed
, awk
和grep
来忽略这样的注释行,或者我是否需要在其中的每一个中使用一些内置功能来让它们忽略注释掉的行?行呢?
如何使sed
, awk
和grep
命令忽略以#开头的行?
您可以对脚本进行以下更改以忽略#
行:
sed
:(由于您已经锚定word
因此以下内容将始终忽略) sed "/^#/!{/^word$/d}" input.txt > output.txt
grep
: grep -v '^#' input.txt | grep "word" > output.txt
要么
如@devnull在注释中所建议,如果您的grep
支持-P
选项,则可以执行以下操作:
grep -P '^(?!#).*word' input.txt > output.txt
这是一个负面的预告,告诉grep
选择行首没有#
单词。
awk
: awk '!/^#/{sub(/.*{/,"")}' RS='}' input.txt > output.txt
您可以接近Bash进程替换,它可以使用脚本中的函数,而不仅仅是外部命令:
#!/bin/bash
strip_comments()
{
sed -e '/^#.*/d' "$1"
}
# like grep "$1" "$2", but on comment-stripped "$2"
grep "$1" <(strip_comments "$2")
# ... other commands that use <(strip_comments ...)
当然,grep无法报告原始文件中的原始位置。 理想情况下,我们希望某种宏语言来隐藏这些内容。
使语法看起来像
grep模式输入
我们将需要宏预处理:可以识别符号input
事物,并使用<(whatever ...)
语法代替宏。
如果只是将其放入变量中,然后使用$ variable,那将无法正常工作; 但是,如果使用eval
则将。 使用eval
,您就不得不逃避双重评估; 不好看
input='<(strip_comments input.txt)' # quoted: this is like a symbol macro
# ...
eval grep '$pattern' $input
(鉴于原始的Bourne外壳是由一个人开发的,他以#include <algol.h>
开始该程序,该头包含用于使C看起来像Algol的宏,该宏的标头不存在,具有讽刺意味的是,宏功能不存在。)
将grep -v '^#' file |
在每个命令前面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.