仅替换一个文件中字符串中的字母数字字符到另一个文件中
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
中的相应字符串,并打印所有行。
由于 以及替换字符串中的 &
也需要转义这一事实(&
单独调用匹配的文本),代码变得有些复杂.
你通常想要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
它假定要替换的字符串包含在标签中,但适用于所示示例。
我有 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
中的相应字符串,并打印所有行。
由于 &
也需要转义这一事实(&
单独调用匹配的文本),代码变得有些复杂.
你通常想要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
它假定要替换的字符串包含在标签中,但适用于所示示例。