Я использовал awk в прошлом для большого управления файлом и замен. Недавно, я использовал его для замены, поскольку исключая буквой A с рядом символов:
$ awk '{gsub(/A/,"@@@")}1' in.txt >> out.txt
где in.txt содержит строки букв различной длины. (AAA, BBB, CCC, ABABAB и т.д.)
Более позднее редактирование: Я использую версию WSL Ubuntu. Кроме того, я рассмотрел sed, но он не работает что хорошо с файлами крупного текста.
Как я могу использовать gsub для замены всех символов в моем файле с @@@, B с ###, C с %%% и т.д.
Я предполагаю, что это должно быть что-то близко к:
$ awk '{gsub(/A|B|C/,"&123")}1' in.txt > out.txt
Большое спасибо!
Более позднее редактирование: Я использую версию WSL Ubuntu на Win10. Кроме того, я рассмотрел использование sed, но он не работает так хорошо с большими файлами.
Насколько я знаю, awk's gsub
не может сделать ничего больше что простая текстовая замена. Вы могли однако использовать повторенные приложения match
функционируйте для реализации основанного на хеше поиска с заменой подстроки - что-то как:
awk '
BEGIN{c["A"]="@@@"; c["B"]="###"; c["C"]="%%%"}
{
while(match($0,/[A-C]/)) {
$0 = substr($0,1,RSTART-1) c[substr($0,RSTART,1)] substr($0,RSTART+1,length($0)-RSTART)
}
}
1
' in.txt
Напротив, perl's s/patt/repl/g
(примерно эквивалентный из awk's gsub
) имеет дополнительное e
флаг, который позволяет выполнение кода RHS. Таким образом, Вы могли сделать что-то как
perl -pe 'BEGIN{%c = (A => "@@@", B => "###", C => "%%%")} $_ =~ s/[A-C]/$c{$&}/ge' in.txt
который, вероятно, намного ближе к тому, что Вы имели в виду.