sed charachter, чтобы оставить матч нетронутым - PullRequest
0 голосов
/ 20 мая 2018

Если у меня есть

123456red100green 123456bee010yellow 123456usb110orange 123456sos011querty 123456let101bottle

, и я хочу, чтобы это было

123456red111green 123456bee111yellow 123456usb111orange 123456sos111querty 123456let111bottle

уведомление: первые 6 символов неt изменить ,,,, следующие 6 изменений ,,,, также эти строки могут быть где угодно в файле (начало, конец, где угодно)

Я хочу указать sed для 1) найти 123456 2) пропуститьследующие три символа 3) замените следующие три на 111

Самое близкое, к чему я пришел: sed '/s/123456....../123456...111/g' Я знаю, что точки что-то значат, но я не знаю эквивалента с другой стороны.Короче говоря как команда sed оставить персонажей в матче нетронутыми.извините за то, что не ясно, чего я хочу, пожалуйста, потерпите меня

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Если вы хотите изменить каждый ноль (как в ваших примерах), тогда просто sed 's/0/1/g' подойдет.Или sed -e '/^123456/ s/0/1/g', чтобы сделать то же самое в строках, начинающихся с 123456.

Но для подсчета символов, как вы просите, используйте ( .. ), чтобы захватить различные части, и \1, чтобы заменить их (используя sed -E).Итак:

echo 123456abcdefgh | sed -Ee 's/^(123456...).../\1111/'

вывод 123456abc111gh.\1 возвращает часть, совпадающую с 123456..., следующие три являются буквенными символами.

(Без -E вам потребуется \( .. \) для группировки.)

0 голосов
/ 20 мая 2018

Соответствие 123456, за которым следуют три символа, которые не подлежат изменению, и затем замена следующих трех символов на 111:

sed 's/\(123456...\).../\1111/g' file

\( ... \) захватывает часть строки, котораямы не хотим изменять.Они повторно вставляются с \1.Весь соответствующий бит строки заменяется на «бит в \( ... \) (то есть \1), за которым следует 111».

...