-1

Я видел этот вопрос, но не смог реализовать то, что искал.

Вот что я хочу:

  • У меня есть файл с несколькими строками, заканчивающимися на 4.1.01.97 (одно и то же число для всех строк, но время от времени число может меняться)
  • Я хочу открыть Vim и изменить номер на другой

Я попытался vim [file_name] +:%s/97/98/g +:wq который работает нормально, но это не поможет, если файл изменится.

Затем я попытался получить нужный номер с помощью grep: cat [file_name] | tail -1 | grep -E '.[0-9][0-9]$'

Я хочу использовать результат этого в моей команде vim ... Что-то вроде использования vim [file_name] +:%s/97/98/g +:wq с командой grep внутри ``, вместо 97 .

Как я могу это сделать?

Если это возможно без vim, это также будет полезно :)

Кроме того, мое регулярное выражение для grep может быть улучшено?


Вот как выглядит файл:

A_,4.1.01.97
B_,4.1.01.97
C_,4.1.01.97
D_,4.1.01.97
E_,4.1.01.97
F_,4.1.01.97
G_,4.1.01.97
H_,4.1.01.97

Вот как я хочу, чтобы файл выглядел так:

A_,4.1.01.98
B_,4.1.01.98
C_,4.1.01.98
D_,4.1.01.98
E_,4.1.01.98
F_,4.1.01.98
G_,4.1.01.98
H_,4.1.01.98

1 ответ1

1

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

sed 's/97/98/g' /path/to/file.txt

Используйте sed -i для изменения файла вместо печати в stdout:

sed -i 's/97/98/g' /path/to/file.txt

Редактировать:

Поскольку вы также хотели узнать, можно ли улучшить свое регулярное выражение, вот предложение получить последний номер конца ваших строк:

tail -1  /path/to/file.txt | grep -o '[0-9]\{1,\}$'

Если вы хотите получить наибольшее целое число, найденное в конце всех строк в файле, вы можете:

grep -o '[0-9]\{1,\}$' /path/to/file.txt | sort -n | tail -1

Вы можете заменить его в файле следующим образом:

sed -i 's/[0-9]\{1,\}$/<your replacement here>/g' /path/to/file.txt

Позднее редактировать:

Вы можете использовать этот лайнер:

pattern=`tail -1 /path/to/file.txt | grep -o '[0-9]\{1,\}$'` && sed -i "s/[0-9]\{1,\}$/${pattern}/" /path/to/file.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .