Regex для добавления символа перед конкретным символом в определенном столбце - PullRequest
1 голос
/ 08 марта 2019

У меня есть этот список (например):

192.168.1.76 admin password
192.168.1.90 admin pa$sword
192.168.1.12 u$er password
192.168.1.200 user pas$word

И я хотел бы добавить \ перед каждым $ (только в третьем столбце).

Используя awk, я попробовал это:

awk '{ gsub("$","\\$",$3); print $3 }'

, но он возвращает это:

password\$
pas$word\$
password\$
pas$word\$

, и я хотел бы это:

password
pas\$word
password
pas\$word

Как я могу это сделать?Спасибо за вашу помощь

Ответы [ 2 ]

3 голосов
/ 08 марта 2019

Ваша команда awk печатает только значения столбца 3 (из-за print $3), и вы просто добавляете \$ в конце столбца 3, потому что $ является привязкой, которая соответствует конечной позиции строки / строки.

Вы можете использовать

awk '{ gsub(/\$/,"\\$",$3) } 1'

См. онлайн awk демо

Здесь gsub(/\$/,"\\$",$3) находит буквенные $ символы и заменяет ихс \$ s и 1 в конце сделать awk распечатать все значения.

2 голосов
/ 08 марта 2019
awk '{ gsub("\\$","\\$",$3); print $3 }' file
password
pa\$sword
password
pas\$word
Функция

awk gsub получает regex в качестве первого параметра, поэтому вам нужно экранировать $.
Вещи внутри двойных кавычек будут сначала расширены, а затем переданы в механизм регулярных выражений, если это параметр регулярных выражений.
Поэтому нам нужно использовать "\\$" или /\$/ для из части, они работают одинаково.
Здесь кажется странным, что от и до выглядит одинаково, но на самом деле они разные.

$ в регулярном выражении означает конец строки или поля, поэтому вы заменили неправильное место.

...