Intereting Posts

Как добавить текст для значения в паре ключ-значение в текстовом файле, который имеет много таких пар

У меня есть текстовый файл keyvalue.txt с содержанием:

 one=abc two=def three=ghi four=jkl five=mno six=pqr 

Теперь я хочу добавить xyz к значению three , которое станет

 three=ghixyz 

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

 one=abc two=def three=ghixyz four=jkl five=mno six=pqr 

Есть ли способ сделать это в сценариях оболочки?

Есть несколько способов; например, с помощью sed :

 sed -i 's/^RELEASESTATUS=.*/&xyz/' keyvalue.txt 

Он ищет строки, начинающиеся с RELEASESTATUS= , соответствующие полной строке (спасибо .* ), И заменяет эти строки содержимым строки ( & ), за которым следует xyz .

Аналогичен ответу Стивена , но немного отличается от того, как он выполняется:

 sed -i '/^RELEASESTATUS=/s/$/xyz/' keyvalue.txt 

Вместо того, чтобы заменять всю строку своей копией с каким-либо текстом, добавленным в конец, это сначала находит правильную строку (строку, которая имеет RELEASESTATUS= в самом начале), а затем заменяет необходимый текст в конце этой строки. ,

При этом используется тот факт, что общая форма команды ( s ) замены в sed

 start,end s/pattern/replacement/flags 

где start и end это диапазон строк, к которым должна применяться команда, в качестве начального и конечного адреса (а «адрес» может быть номером строки, регулярным выражением или смещением). При использовании одного адреса команда применяется только к этой строке (или к отдельным строкам, соответствующим определенному регулярному выражению).

Вы также можете попробовать с awk :

 awk 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt 

И если у вас GNU awk 4.1.0 или новее, вы можете сделать это на месте:

 gawk -i inplace -v INPLACE_SUFFIX=.bak 'BEGIN { FS = OFS = "=" }; $1 == "RELEASESTATUS" { $2 = $2"xyz"; }; 1' keyvalue.txt