我有两个文件,一个文件包含一个字符串列表。
+stringa +Dog +Cat
+cat +Tux +elephant
第二个文件(csv)包含以下内容:
"123456 Abc","+Stringx +123","something"
"23456 dEf","+cat +Tux +elephant","Other something"
"34524 xyz","+stringa +Dog +Cat","third something"
结果应该是:
"123456 Abc","+Stringx +123","something"
"23456 dEf","+cat +tux +elephant","Other something"
"34524 xyz","+stringa +dog +cat","third something"
如何将与我的模式列表匹配的字符串更改为小写?
我的逗号分隔值文件有大约 30 列和大约 1500 行。
With
GNU sed
, 假设您在字符串列表中没有任何元字符,+
不是具有默认 BRE 的元字符\L
将字符串转换为小写g
用于替换一行中的所有匹配项,i
用于不区分大小写的匹配如果你没有
GNU sed
正如 Stéphane Chazelas 所指出的,如果内容不受控制,这可能会导致代码注入
f1
漏洞AWK
解决方案(针对您当前的输入):假设第二个字段是主要兴趣并且搜索文件中的值是双引号。
$0="\042"$0"\042"
-在遍历文件行时用双引号包裹模式行patterns
a[$0]
- 将图案线捕获到数组中a
$2 in a{ $2=tolower($2) }
- 如果文件行的第二个字段值file.csv
在模式列表中(即数组a
) - 将其中的所有字符转换为小写$2=tolower($2)
输出:
使用
perl
,假设您希望将第一个文件中的每个单词都转换为小写:local $/ = undef
使 BEGIN 块的记录分隔符未定义,以便对<>
那里的一次调用,将整个第一个文件 (file1.words
) 吞入其中。我们在空格上拆分它(与is in相同split " "
的特殊方式),并将结果单词与在正则表达式引用它们并使它们不区分大小写之后。perl
awk -F " "
awk
|
所以我们有一个巨大的正则表达式,就像
(?i:word1)|(?i:word2)|...
我们在其余代码的第二个文件的每一行上应用的一样。如果是第一个文件的每一行中的每个字符串,那么可以简化为:
在那里,我们在标准输入上打开第一个文件,而不是将其作为参数传递。
<STDIN>
返回它的行列表,我们从中删除分隔符chomp
,并加入|
如上所述。如果您不希望它仅限于 ASCII 字符,请添加该
-Mopen=locale
选项。