Как добавить строку до и после строки с помощью sed

то, что сработало для меня, - это решение, описанное в ссылке, опубликованной Mário:

http://www.liberiangeek.net/2013/04/how-to-restart-unity-and-compiz -in-ubuntu-13-04-raring-ringtail /

Шаги:

 sudo apt-get install dconf-tools
 dconf reset -f /org/compiz/
 unity --reset-icons

и снова войти в систему

1
задан 4 September 2015 в 00:31

2 ответа

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

sed -n '/\[Z\]$/ s/^/<font>/;/\[Z\]$/ s/$/<\/font>/p' file.txt

Поскольку вы будете использовать его поверх STDOUT другой команды, используйте его как, например. :

some command | sed -n '/\[Z\]$/ s/^/<font>/;/\[Z\]$/ s/$/<\/font>/p'

В основном он состоит из двух частей:

/\[Z\]$/ s/^/<font>/ будет соответствовать линии, которая наконец имеет [Z], а затем добавит <font> в начале строка s/^/<font>/ /\[Z\]$/ s/$/<\/font>/ будет соответствовать [Z] в конце строки, а затем добавит </font> в конце строки, используя /$/<\/font>/.

Пример:

$ cat file.txt 
service:clus1-svr          clus1-node2                      started    [Z]
service:clus1-svr          clus1-node2                      started

$ sed -n '/\[Z\]$/ s/^/<font>/;/\[Z\]$/ s/$/<\/font>/p' file.txt 
<font>service:clus1-svr          clus1-node2                      started    [Z]</font>

Как отметил @glennjackman, вы также можете использовать конструкцию группировки для выполнения всех замен для одного совпадения:

$ sed -n '/\[Z\]$/ { s/^/<font>/; s/$/<\/font>/p }' file.txt 
<font>service:clus1-svr          clus1-node2                      started    [Z]</font>

Как насчет решения bash:

while IFS= read -r line; do [[ $line =~ \[Z\]$ ]] && echo "<font>${line}</font>"; done <file.txt

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

some command | while IFS= read -r line; do [[ $line =~ \[Z\]$ ]] && echo "<font>${line}</font>"; done

Это использует ту же логику, что и sed один. Если строка заканчивается на [Z] ([[ $line =~ \[Z\]$ ]]), тогда строка печатается в нужном формате.

Пример:

$ while IFS= read -r line; do [[ $line =~ \[Z\]$ ]] && echo "<font>${line}</font>"; done <file.txt 
<font>service:clus1-svr          clus1-node2                      started    [Z]</font>
4
ответ дан 23 May 2018 в 17:45
  • 1
    sed имеет конструкцию группировки, поэтому вы можете написать sed '/\[Z\]/ { s/^/<font>; s,$,</font>, } – glenn jackman 4 September 2015 в 00:25
  • 2
    @glennjackman Спасибо..АФАИК это расширение GNU, не так ли? – heemayl 4 September 2015 в 00:30
  • 3
    Также я думаю, что OP были близки к их попытке: sed -i '/\[Z\]$/ s/.*/<font>&<\/font>/' infile – kos 4 September 2015 в 00:30
  • 4
    @kos Да, твоя модификация на деньги .... – heemayl 4 September 2015 в 00:33
  • 5
    @kos done .... :) – heemayl 4 September 2015 в 00:57

Awk version.

Протестировано с примером OP, вставленным дважды в один и тот же файл, так как вы можете видеть, что он редактирует те две строки, которые имеют [Z], и два, которые не содержат it

  $ awk ' {if ($0~/\[Z\]/)  print "<font>"$0"</font>";else print}' testfile.txt                                                                   
<font>service:clus1-svr          clus1-node2                      started    [Z]</font>
service:clus1-svr          clus1-node2                      started
<font>service:clus1-svr          clus1-node2                      started    [Z]</font>
service:clus1-svr          clus1-node2                      started

Чтобы вывести изменения в файл, используйте следующую конструкцию:

awk ' {if ($0~/\[Z\]/) print "<font>"$0"</font>";else print}' testfile.txt > /tmp/tmp.txt && cat /tmp/tmp.txt > testfile.txt

1
ответ дан 23 May 2018 в 17:45
  • 1
    Мне нравится это решение больше, чем мое решение. Я забыл, что вы можете конкатенировать строки таким образом с помощью print – kos 4 September 2015 в 01:00
  • 2
    Да. Это абсолютно здорово. Спасибо, Серг. У меня проблемы, потому что я не могу выбрать вас всех победителем :( Да, вы, ребята, камни! – Samiron Mallick 5 September 2015 в 11:13

Другие вопросы по тегам:

Похожие вопросы: