сед с группой захвата - PullRequest
0 голосов
/ 02 мая 2019

У меня есть строки, как показано ниже

VIN_oFDCAN8_8d836e25_In_data;
IPC_FD_1_oFDCAN8_8d836e25_In_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_data

Я хочу вставить _Moto между ними, как показано ниже

VIN_oFDCAN8_8d836e25_In_Moto_data
IPC_FD_1_oFDCAN8_8d836e25_In_Moto_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_Moto_data

Но когда я использовал sed с группой захвата, как показано ниже

echo VIN_oFDCAN8_8d836e25_In_data | sed 's/_In_*\(_data\)/_Moto_\1/'

Я получаю вывод как:

VIN_oFDCAN8_8d836e25_Moto__data

Можете ли вы указать мне правильное направление?

Ответы [ 3 ]

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

Хотя вы могли бы использовать простую подстановку строки IN (учитывая, что она присутствует только 1 раз в вашем файле ввода_), но, поскольку вы специально запросили стиль захвата в sed, вы можете попробовать выполнить следующее.

sed 's/\(.*_In\)\(.*\)/\1_Moto\2/g'  Input_file

Также выше добавит строку _Moto, чтобы избежать добавления 2 раза _ после Moto путаницы, спасибо @Bodo за упоминание того же в комментариях.

Проблема с попыткой OP: поскольку вы НЕ сохраняете _In_* в памяти sed, поэтому он принимает \(_data_\) только в качестве первого элемента в памяти, поэтому он не работает, я исправил это в выше, нам нужно хранить все до _IN в памяти, и тогда он будет летать.

0 голосов
/ 02 мая 2019
$ sed 's/_[^_]*$/_Moto&/' file
VIN_oFDCAN8_8d836e25_In_Moto_data
IPC_FD_1_oFDCAN8_8d836e25_In_Moto_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_Moto_data
0 голосов
/ 02 мая 2019

В вашем случае вы можете напрямую заменить соответствующую строку приведенной ниже командой

echo VIN_oFDCAN8_8d836e25_In_data | sed 's/_In_data/_In_Moto_data/'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...