Поиск и замена Perl: замена конца строки также заменяет начало строки - PullRequest
0 голосов
/ 10 мая 2019

У меня есть файл [data.txt] со следующими данными

a,b,c,d,e
e,f,g,h,i
j,k,l,m,n

Я использую следующую команду perl, чтобы заменить конец строки некоторым текстом.

perl -pi -e 's/$/ X/g' data.txt

Тем не менее, мой файл отражает следующее (он также заменяет начало строки)

a,b,c,d,e X
 Xe,f,g,h,i X
 Xj,k,l,m,n X

Это неожиданно, кто-нибудь может указать, если я упускаю что-то очевидное?

Приветствие Саурабй

Ответы [ 3 ]

2 голосов
/ 10 мая 2019

Вы также можете переписать его на:

perl -i -ple '$_ .= " X"' data.txt

, который легче читать в этом случае. Я думаю. Опция -l сначала удаляет \n из каждой строки, а затем добавляет ее после (прямо перед -p рингтами), так что вам в основном не нужно думать о \n.

2 голосов
/ 10 мая 2019

Когда /m не используется, $ эквивалентно (?=\n\z)|\z.

Как видите, он может совпадать в двух разных местах.Например, в следующем случае он может совпадать в позиции 9 ((?=\n\z)) и в позиции 10 (\z).

01234567890   <- positions
a,b,c,d,e␊

Решение: Удалите /g, чтобы соответствовать только первому издва.

perl -pe's/$/ X/'

Решение. Удалите переводы строк и сопоставьте их в конце строки.

perl -ple's/\z/ X/'    # «$» would work as well as «\z», but I like to say what I mean.

Решение: Удалите переводы строк и просто используйте объединение.

perl -ple'$_.=" X"'
1 голос
/ 10 мая 2019

Вот один из способов:

perl -pi -e 's/(.+)$/$1X/' data.txt

РЕДАКТИРОВАТЬ: Удалено g как предложено. Кроме того, если удалить g, решение можно упростить до

perl -pi -e 's/$/X/' data.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...