<p>AWK可用于此目的。你知道吗</p>
<p>见<a href="https://www.gnu.org/software/gawk/manual/html_node/Redirection.html" rel="nofollow">https://www.gnu.org/software/gawk/manual/html_node/Redirection.html</a>
其中包含以下概念示例:</p>
<pre><code>$ awk '{ print $2 > "phone-list"
> print $1 > "name-list" }' mail-list
$ cat phone-list
-| 555-5553
-| 555-3412
…
$ cat name-list
-| Amelia
-| Anthony
…
</code></pre>
<p>邮件列表中有两列信息:第一列包含姓名,第二列包含电话号码。你知道吗</p>
<p>请参阅<code>match(string,regex)</code>函数(<a href="http://www.grymoire.com/Unix/Awk.html#uh-47" rel="nofollow">http://www.grymoire.com/Unix/Awk.html#uh-47</a>)以获取正则表达式,记住$0指定读入的整行。此函数返回RSTART和RLENGTH,可与<code>substr(string,position,length)</code>(<a href="http://www.grymoire.com/Unix/Awk.html#uh-43" rel="nofollow">http://www.grymoire.com/Unix/Awk.html#uh-43</a>)函数一起使用,以返回匹配的模式(如果按行搜索,则string=$0)。你知道吗</p>
<p>关于AWK的一个很好的介绍是:<a href="http://www.grymoire.com/Unix/Awk.html" rel="nofollow">http://www.grymoire.com/Unix/Awk.html</a>
…可能看起来很长,但值得投资。你知道吗</p>
<p><strong>更新</p>
<p>如果您实际处理的是包含信息字段的多行,并且您并不特别关心找到的项目是否以相同的列形式打印,那么下面的操作将起作用:</p>
<pre><code>echo -e " apple pears banana \n kiwi ananas cocoa\n pork" |
awk '{
#printf "\n"
for(j=1;j<=NF;j++){
i=match($j,/[ab][a-z]+/)
if(i>0){
print $j > "removed.txt"
}else{
printf $j " "
}
}
}'
</code></pre>
<p>如果您确实想保留列形式,那么您可以使用上面注释的<code>printf</code>函数,只需稍加调整即可获得正确的结果(并将第二个<code>print</code>替换为<code>printf $j " "</code>)。但是,由于AWK处理字段,如果您在要捕获的单个字段中有多个模式实例(即在字段之间没有分隔符),那么上述方法将导致问题。你知道吗</p>
<p><strong>更新2</strong></p>
<p>下面是一个更好的解决方案,它将确保找到所有匹配项,并且与字段无关:</p>
<pre><code>echo -e " apple pears banana \n kiwi ananas cocoa" |
awk '
BEGIN {
regex="a.{2,3}";
}
{
ibeg=1;
imat=match(substr($0,ibeg),regex);
after=$0;
while (imat) {
before = substr($0,ibeg,RSTART-1);
pattern = substr($0,ibeg+RSTART-1,RLENGTH);
after = substr($0,ibeg+RSTART+RLENGTH-1);
printf before;
print pattern >"removed.txt";
ibeg=ibeg+RSTART+RLENGTH-1;
imat=match(substr($0,ibeg),regex);
}
print after;
}
'
</code></pre>
<p>输出:</p>
<pre><code>e peba
kiwi ocoa
</code></pre>
<p>已删除:</p>
<pre><code>$ cat removed.txt
appl
ars
anan
anan
as c
</code></pre>