我正在编写脚本,我想检查文件的第一行是否匹配特定的模式,然后将其打印出来。我该如何实现?
如何检查图案?有没有一种方法可以检查模式并根据输出执行某些操作。
编辑:请看一下这个问题:https : //stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file
我想要这样的东西,但是他们都没有为我工作。我基本上想检查第一行是否匹配正则表达式模式,并根据该结果打印文件行。
我正在编写脚本,我想检查文件的第一行是否匹配特定的模式,然后将其打印出来。我该如何实现?
如何检查图案?有没有一种方法可以检查模式并根据输出执行某些操作。
编辑:请看一下这个问题:https : //stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file
我想要这样的东西,但是他们都没有为我工作。我基本上想检查第一行是否匹配正则表达式模式,并根据该结果打印文件行。
Answers:
您可以使用ed
:
ed -s infile <<\IN 2>/dev/null
1s/PATTERN/&/
,p
q
IN
这里的关键是要尝试更换PATTERN
上1st
与自己一致。ed
如果找不到指定的模式,则会出错,因此,p
(打印整个文件)仅在1s/PATTERN/&/
成功的情况下执行。
或搭配sed
:
sed -n '1{
/PATTERN/!q
}
p' infile
此q
UITS如果第一行不(!
)匹配PATTERN
,否则它p
rints所有行。
或者,正如Toby Speight所指出的那样,使用GNU sed
:
sed '1{/PATTERN/!Q}' infile
Q
与相同,q
但不打印图案空间。
Q
代替q
GNU sed或d
在q
(便携式)之前,以免分别要求-n
flag和p
command:sed '1{/PATTERN/!Q}' infile
或sed -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile
。
d
重新启动命令周期总是让我失望!:-|
sed
,第一个sed
命令会抱怨sed: -e expression #1, char 10: extra characters after command
(由于p
),但是ed
和最后一个sed
建议都可以正常工作。
sed -n '1{/PATTERN/!q};p'
awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt
会txt
在当前目录中打印未隐藏文件的名称,该文件的第一行将扩展的正则表达式pattern
与那些awk
支持的补充nextfile
匹配。
如果要打印整个文件内容而不是打印文件名,则可以执行以下操作:
awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt
这是有效的,因为它仅运行一个命令,但awk
不是转储文件内容(对于大文件)的最有效命令,您可以通过执行以下操作来获得更好的性能:
awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
xargs -r0 cat
也就是说,仅用于awk
打印匹配(以0分隔)并依赖于cat
转储其内容的文件列表。
如果您正在编写Shell脚本,则可以这样
for file in ./*; do head -n 1 "$file" | grep -q 'PATTERN' && cat "$file"; done
或者,在Perl中:
perl -Tlne '$f = /PATTERN/ if $. == 1; print if $f; $. = 0 if eof' ./*
close ARGV
更加习惯$.
。
Oldschool,只需将您的句子翻译成标准命令即可:
for file in *; do
if head -n 1 "${file}" | grep -q 'PATTERN'; then
cat "${file}"
fi
done
学习bash是一个好的开始。如果您只需要快速解决方案,请尝试使用sed,awk或perl答案。两者都很不错,但是它们是您需要(并且可能想要)学习的自己的语言。
这是一个非常简单的示例,因此,如果您想了解更多信息,也可以尝试使用ruby,php,js(例如,在nodejs中)或其他允许文件访问的语言进行相同的尝试。即使是C / C ++或Java,也应该可以轻松完成一项小任务。