我正在尝试搜索文件夹中的所有文件以获取以下字符串
<cert>
</cert>
但是,我必须删除换行符。 以下代码适用于一个文件,但如何通过tr和grep管道整个文件夹? -l选项仅打印文件名而不是整个文件。
tr -d '\n' < test | grep -l '<cert></cert>'
答案 0 :(得分:1)
tr
/ grep
方法需要grep
将整个文件作为一行处理。虽然GNU grep
可以处理长行,但许多其他人不能。此外,如果文件很大,可能会对内存征税。
以下内容可以避免这些问题。它会搜索当前目录中的所有文件,并在一行中报告包含<cert>
的任何文件的名称,并在下一行报告</cert>
的名称:
awk 'last ~ "<cert>" && $0 ~ "</cert>" {print FILENAME; nextfile} {last=$0}' *
awk隐式循环遍历文件中的所有行。
此脚本使用一个变量last
,其中包含上一行的文本。
last ~ "<cert>"
&amp;&amp; $ 0~&#34;&#34;`
此测试是否(a)最后一行包含字符<cert>
和(b)当前行包含字符</cert>
。
如果您确实想要包含<cert>
而不包含其他字符的行,请将~
替换为==
。
{print FILENAME; nextfile}
如果前面的条件返回true,则打印文件的名称并从下一个文件开始。
(nextfile
是awk的common extension,成为POSIX 2012.)
{last=$0}
这会将变量last
更新为当前行。