2

Я хочу изменить ячейку в файле, когда мое желаемое состояние существует. Пример:

Файл:

id311    vmName1    state0
id312    vmName2    state0
id313    vmName3    state0

Я напишу сценарий, и этот сценарий изменяет столбец состояния только одной строки. Поэтому, если я sed -i 's/state0/state1/g' все state0 будут state1 . Я хочу изменить состояние только одной строки, например:

Файл:

id311    vmName1    state0
id312    vmName2    state1
id313    vmName3    state0 

Как я могу использовать команду sed для специальной строки с идентификатором использования? примечание: идентификаторы уникальны.

2 ответа2

3

Просто добавьте номер строки перед: sed '<line number>s/<search pattern>/<replacement string>/ .

$ sed '1s/state0/XXXX/' file
id311    vmName1    XXXX
id312    vmName2    state0
id313    vmName3    state0

Поскольку вы хотите редактировать на месте, скажите:

sed -i.bak '1s/state0/XXXX/' file

Заметьте, я использую .bak после флага -i . Это выполнит изменение самого file , но также создаст файл резервной копии file.bak с текущим содержимым file до изменения.


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

sed -i.bak "${lineNumber}s/state0/XXXX/" file
2

Как я могу использовать команду sed для специальной строки с идентификатором использования? примечание: идентификаторы уникальны.

Поскольку id уникальны, имеет смысл использовать первое поле в качестве ключа:

sed -i '/id312/s/state0/state1/' file

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

#!/usr/bin/env bash
sed -i "/id$1/s/state0/state1/" $2

вызывая это так:

./sed.sh 312 file

Примечание: всегда будьте осторожны с ключом -i : сначала тестируйте без него.

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