Mat*_*hew 11 text-processing regular-expression files
我正在编写一个脚本,我想检查文件的第一行是否与某个模式匹配,如果匹配,则打印出文件。我怎样才能做到这一点?
我如何检查模式?有没有办法检查模式并根据输出做一些事情..
编辑:请看一下这个问题:https : //stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file
我想要这样的东西,但没有一个对我有用。我基本上想检查第一行是否与正则表达式模式匹配,并根据它打印文件行。
don*_*sti 17
你可以这样做ed
:
ed -s infile <<\IN 2>/dev/null
1s/PATTERN/&/
,p
q
IN
Run Code Online (Sandbox Code Playgroud)
这里的关键是要尝试更换PATTERN
上1st
与自己一致。ed
如果找不到指定的模式,则会出错,因此,p
(打印整个文件)只有在1s/PATTERN/&/
成功时才会执行。
或与sed
:
sed -n '1{
/PATTERN/!q
}
p' infile
Run Code Online (Sandbox Code Playgroud)
此q
UITS如果第一行不(!
)匹配PATTERN
,否则它p
rints所有行。
或者,正如Toby Speight所指出的,使用 GNU sed
:
sed '1{/PATTERN/!Q}' infile
Run Code Online (Sandbox Code Playgroud)
Q
与相同q
但不打印模式空间。
cuo*_*glm 15
使用 POSIX 工具箱:
{ head -n 1 | grep pattern && cat; } <file
Run Code Online (Sandbox Code Playgroud)
awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt
Run Code Online (Sandbox Code Playgroud)
将打印的非隐藏的名字txt
在当前目录中,其第一行中,扩展正则表达式匹配的文件pattern
与那些awk
inplementations的支持nextfile
。
如果您想打印整个文件内容而不是打印文件名,则可以执行以下操作:
awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt
Run Code Online (Sandbox Code Playgroud)
这很有效,因为它只运行一个命令,但awk
不是转储文件内容的最有效命令,对于大文件,您可以通过执行以下操作获得更好的性能:
awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
xargs -r0 cat
Run Code Online (Sandbox Code Playgroud)
也就是说,仅用于awk
打印匹配(0 分隔)的文件列表并依赖于cat
转储其内容。
如果你正在编写一个 shell 脚本,你可以像
for file in ./*; do head -n 1 "$file" | grep -q 'PATTERN' && cat "$file"; done
Run Code Online (Sandbox Code Playgroud)
或者,在 Perl 中:
perl -Tlne '$f = /PATTERN/ if $. == 1; print if $f; $. = 0 if eof' ./*
Run Code Online (Sandbox Code Playgroud)
小智 5
Oldschool,只需将您的句子翻译成标准命令:
for file in *; do
if head -n 1 "${file}" | grep -q 'PATTERN'; then
cat "${file}"
fi
done
Run Code Online (Sandbox Code Playgroud)
对于学习 bash 来说,这是一个好的开始。如果您只需要快速解决方案,请尝试使用 sed-、awk- 或 perl-answers。两者都不错,但它们是您需要(并且可能想要)学习的自己的语言。
这是一个非常简单的例子,所以如果你想了解更多,你也可以在 ruby、php、js(例如在 nodejs 中)或任何其他允许文件访问的语言中尝试相同的方法。即使是 C/C++ 或 Java 也应该很容易管理一个小任务。
归档时间: |
|
查看次数: |
5082 次 |
最近记录: |