Ваш интервал неясен, есть ли у вас "a : ..."
или "a: ..."
. У вас также есть то, что похоже на json, и если это так, вам нужно использовать утилиту с поддержкой json, чтобы убедиться, что результат проверен как действительный json.
Если, однако, это просто текст тогда awk
может обработать любой регистр ("a : ..."
или "a: ..."
) для вас, проверив, соответствует ли первое поле (или первое и второе в случае "a : ..."
) вашему префиксу a:
. Затем вы просто добавляете _1
в конец строки, чтобы сохранить начальные пробелы, используя функцию sub
на всей строке (например, $0
). Во всех случаях строка выводится либо без изменений, либо с добавлением _1
, если ваш префикс соответствует.
Вы можете сделать это с помощью:
awk '$1=="a:" || ($1=="a" && $2==":") {sub(/"$/,"_1\"",$0)}1' file
( note: вы можете удалить любую сторону ||
, в которой нет необходимости)
Вы можете просмотреть пользователя функции sub
в GNU awk - Функции управления строками
Пример использования / Вывод
С вашим входным файлом в file
, следующие результаты:
$ awk '$1=="a:" || ($1=="a" && $2==":") {sub(/"$/,"_1\"",$0)}1' file
{
a : "apple_1"
b : "orange"
}
{
a : "meat_1"
}
Использование sed
Вы также можете выполнить sh то же самое с помощью sed
(что может быть немного более эффективно в этом случае), используя:
sed '/^\s*a\s:/s/"$/_1"/' file
Посмотрите вещи и дайте мне знать, если у вас есть вопросы.