2017-01-04 2 views
0

У меня есть файл с одной строкой:как изменить шаблон в строке файла

22:50133-MM:MM1,52-MM:MM2;23:254940-MM:MM1,63-MM:MM2;24:15574-MM:MM1,65-MM:MM2; 

Мне нужно найти эту часть линии 24:15574-MM, а затем заменить номер 15574 на другой. Число может быть любой длины.

Я хочу использовать bash для этого, но я понятия не имею, как это сделать. Как я могу это сделать? Пожалуйста помоги.

+0

Пожалуйста, обратите внимание на [редактирование-помощь] (http://stackoverflow.com/editing-help). – Cyrus

+0

Я предлагаю использовать команду 'sed'' '': 's/regexp/replacement /'. См. 'Man sed'. – Cyrus

ответ

1

Поскольку вы просили я хочу использовать bash для него, вот попытка использования только родные операторы в нем; используя функцию regEx с ее оператором ~ (поддерживается от bash 3.0 и далее).

Предположим, что ваш файл только одна строка в нем, вы можете сделать следующие шаги,

  • Следующие команды можно запустить непосредственно из командной строки (или)
  • наматывается его в сценарии оболочки с помощью bash she-bang (#!/bin/bash).

Захват содержимого файла для regEx с использованием <file, в котором хранится полное содержимое файла в переменной.

fileContent=$(<file) 
[[ $fileContent =~ .*24:([[:digit:]]+)-MM.* ]] && replacement="${BASH_REMATCH[1]}" 
replaceValue=5555 
printf "%s\n" "${fileContent/$replacement/$replaceValue}" 

Для вашего входного файла, команды выдавать результат

22:50133-MM:MM1,52-MM:MM2;23:254940-MM:MM1,63-MM:MM2;24:5555-MM:MM1,65-MM:MM2; 
+1

Спасибо Inian. Ваше решение - именно то, что я хочу. –

1

Это может быть легко достигнуто с помощью sed команды с -i вариант:

new_number=11111 
sed -i "s/24:\(15574\)-MM/24:$new_number-MM/" /tmp/test.txt 

/tmp/test.txt - заменить с текущим FilePath

new_number - это переменная для числа замены


Для замены с использованием регулярных выражений шаблон используйте следующую команду с -E включенной опцией (расширенный режим регулярных выражений):

sed -i -E "s/24:(15574)-MM/24:$new_number-MM/" /tmp/test.txt

+0

Да, вы правы. Но число (15574) должно быть регулярным. Как я могу использовать regexp для этого? –

+0

@ j.stalin, как для regexp, см. Мое обновление – RomanPerekhrest

Смежные вопросы