仅替换一个文件中字符串中的字母数字字符到另一个文件中

Replace only alphanumeric chars from strings in one file in another

我有 file1 个记录,我想在 file2 中查找并用 # 替换并将输出重定向到 file3。我只想翻译 file2 中的字母数字字符。使用以下代码我无法获得预期的输出。我做错了什么?

file_read=`cat file2`
while read line; do
  var=`echo $line | tr '[a-zA-Z0-9]' '#'`
  rep=`echo $file_read | awk "{gsub(/$line/,\"$var\"); print}"`
done < file1
echo file2 > file3

cat file1

2001009
@vanti Finserv Co.
2001009
Fund #1
11:11 - Capital
MS&CO(NY)
American Friends Org, Inc. 12X32
Domain-Name (LLC)
MS&CO(NY)
MS&CO(NY)
Ivy/Estate Rd
E*Trade wholesale

cat file2

<html>
<body>
<hr><br><>span class="table">Records</span><table>
<tr class="column">
 <td>Rec1</td>
 <td>Rec2</td>
 <td>Rec3</td>
 <td>Rec4</td>
 <td>Rec5</td>
 <td>Rec6</td>
 <td>Rec7</td>
 <td>Rec8</td>
</tr>
<tr class="data">
<td>@vanti Finserv Co.</td>
<td>11:11 - Capital</td>
<td>MS&CO(NY)</td>
<td>New York</td>
<td>CDX98XSD</td>
<td>E*Trade wholesale</td>
<td>Domain-Name (LLC)</td>
<td>Ivy/Estate Rd</td>
<td></td>
</tr>
<tr class="data">
<td>@vanti Finserv Co.</td>
<td></td>
<td>MS&CO(NY)</td>
<td>2</td>
<td>2</td>
<td>MS&CO(NY)</td>
<td>MS&CO(NY)</td>
<td>Ivy/Estate Rd</td>
</table>
</body>
</html>

预期输出 cat file3

<html>
<body>
<hr><br><>span class="table">Records</span><table>
<tr class="column">
 <td>Rec1</td>
 <td>Rec2</td>
 <td>Rec3</td>
 <td>Rec4</td>
 <td>Rec5</td>
 <td>Rec6</td>
 <td>Rec7</td>
 <td>Rec8</td>
</tr>
<tr class="data">
<td>@##### ####### ##.</td>
<td>##:## - #######</td>
<td>##&##(##)</td>
<td>New York</td>
<td>CDX98XSD</td>
<td>#*##### ########</td>
<td>######-#### (###)</td>
<td>###/###### ##</td>
<td></td>
</tr>
<tr class="data">
<td>@##### ####### ##.</td>
<td></td>
<td>##&##(##)</td>
<td>2</td>
<td>2</td>
<td>##&##(##)</td>
<td>##&##(##)</td>
<td>###/###### ##/td>
</table>
</body>
</html>

您似乎在寻找类似

的东西
awk 'NR==FNR {
  regex = [=10=];
  gsub(/[][(){}|\*+?.^$]/, "\\&", regex);
  a[++n] = regex;

  gsub(/[A-Za-z0-9]/, "#");
  gsub(/&/, "\\&");
  b[n] = [=10=];

  next
}
{ for(i=1;i<=n;++i)
    gsub(a[i], b[i])
} 1' file1 file2 >file3

简而言之,我们用 file1 中的短语填充数组 a,用相应的替换字符串填充 b。对于第一个输入文件,条件 FNR==NR 将为真;然后我们进入脚本的其余部分,它只是将 a 中的任何字符串替换为 b 中的相应字符串,并打印所有行。

由于 以及替换字符串中的 & 也需要转义这一事实(& 单独调用匹配的文本),代码变得有些复杂.

演示:https://ideone.com/YkAkAZ

你通常想要avoid while read loops in the shell;当您想要对文件中的所有行执行某些转换时,awk 更快、更惯用。

另外,请尝试http://shellcheck.net/ before asking for human assistance. Even after you fixed syntax errors pointed out in comments, your attempt contains common beginner errors such as broken quoting.

请您尝试以下操作:

awk '
    NR==FNR {s = [=10=]; gsub("[[:alnum:]]", "#"); a[s] = [=10=]; next}
    {
        if (match([=10=], ">[^<]+")) {
            str = substr([=10=], RSTART+1, RLENGTH-1)
            if (str in a) {
                [=10=] = substr([=10=], 1, RSTART) a[str] substr([=10=], RSTART+RLENGTH)
            }
        }
    }
1 ' file1 file2 > file3

它假定要替换的字符串包含在标签中,但适用于所示示例。