Eu tenho dois arquivos, um arquivo contém uma lista de strings.
+stringa +Dog +Cat
+cat +Tux +elephant
e o segundo arquivo (csv) contém algo como:
"123456 Abc","+Stringx +123","something"
"23456 dEf","+cat +Tux +elephant","Other something"
"34524 xyz","+stringa +Dog +Cat","third something"
o resultado deve ser:
"123456 Abc","+Stringx +123","something"
"23456 dEf","+cat +tux +elephant","Other something"
"34524 xyz","+stringa +dog +cat","third something"
Como posso alterar as strings que correspondem à minha lista de padrões para letras minúsculas?
Meu arquivo de valores separados por vírgula tem cerca de 30 colunas e cerca de 1.500 linhas.
Com
GNU sed
, assume que você não tem nenhum metacaracter na lista de strings,+
não é um metacaracter com BRE padrão\L
para converter string para minúsculasg
para substituir todas as ocorrências em uma linha,i
para correspondência sem distinção entre maiúsculas e minúsculasSe você não tem
GNU sed
Conforme observado por Stéphane Chazelas, isso pode levar a vulnerabilidades de injeção de código se o conteúdo de
f1
não estiver sob controleAWK
solução (para sua entrada atual):Supondo que o segundo campo seja de interesse principal e os valores no arquivo de pesquisa estejam entre aspas duplas.
$0="\042"$0"\042"
- envolva uma linha padrão com aspas duplas enquanto itera pelas linhas dopatterns
arquivoa[$0]
- captura de uma linha padrão em arraya
$2 in a{ $2=tolower($2) }
- se o valor do 2º campo da linha dofile.csv
arquivo estiver na lista de padrões (ou seja, matriza
) - converta todos os caracteres para letras minúsculas$2=tolower($2)
A saída:
Com
perl
, supondo que você queira que cada palavra no primeiro arquivo seja transformada em minúsculas:local $/ = undef
torna o separador de registros para o bloco BEGIN indefinido, de modo que a única invocação de lá elimine todo o<>
primeiro arquivo (file1.words
). depois de citá- los com regex e torná-los insensíveis a maiúsculas e minúsculas.split " "
perl
awk -F " "
awk
|
Portanto, temos um enorme regexp que é algo parecido
(?i:word1)|(?i:word2)|...
com o que aplicamos em cada linha do segundo arquivo no restante do código.Se for cada string em cada linha do primeiro arquivo, isso pode ser simplificado para:
Lá, abrimos o primeiro arquivo no stdin em vez de passá-lo como argumento.
<STDIN>
retorna uma lista de suas linhas das quais removemos os delimitadores comchomp
, e juntamos com|
como acima.Se você não quiser que seja limitado a caracteres ASCII, adicione a
-Mopen=locale
opção.