Как добавить текст в конец строки, содержащей несколько строк?

Правда?ДВАминуса? ЯДЕЙСТВИТЕЛЬНОиспользую этот скриптИего считают "правильным ответом". ВТФ?


В продолжение ответа @ Томаса Дикиотносительно соляризованного сценария

fbterm initcиспользуетдесятичные значения , а нешестнадцатеричные значениятак что вам придется переписать большую часть этого. После этого он вызывается в другом скрипте (например, /etc/profile или ~/.bashrc) с использованием:

. solarized-fbterm.sh

К счастью, я уже сделал это, solarized-fbterm.sh:

#!/bin/bash
#
# Author: paul.wratt@gmail.com (Paul Wratt)
# Original: benley@gmail.com (Benjamin Staffin)
# Set your fbterm's color palette to match the Solarized color scheme by
# using escape sequences. fbterm uses decimal values not hex values.
#

set -o nounset

base03="0;43;54"
base02="7;54;66"
base01="88;110;117"
base00="101;123;131"
base0="131;148;150"
base1="147;161;161"
base2="238;232;213"
base3="253;246;227"
yellow="181;137;0"
orange="203;75;22"
red="220;50;47"
magenta="211;54;130"
violet="108;113;196"
blue="38;139;210"
cyan="42;161;152"
green="133;153;0"

printf "\033[3;234;$base03}\033[3;235;$base02}\033[3;240;$base01}\033[3;241;$base00}\033[3;244;$base0}\033[3;245;$base1}\033[3;254;$base2}\033[3;230;$base3}\033[3;136;$yellow}\033[3;166;$orange}\033[3;160;$red}\033[3;125;$magenta}\033[3;61;$violet}\033[3;33;$blue}\033[3;37;$cyan}\033[3;64;$green}"

function cset() {
  ANSI=$1
  RGB=$2
  printf "\033[3;%d;%s}" $ANSI "$RGB"
}

#black
cset 0 $base02
cset 8 $base03

#red
cset 1 $red
cset 9 $orange

#green
cset 2 $green
cset 10 $base01

#yellow
cset 3 $yellow
cset 11 $base00

#blue
cset 4 $blue
cset 12 $base0

#magenta
cset 5 $magenta
cset 13 $violet

#cyan
cset 6 $cyan
cset 14 $base1

#white
cset 7 $base2
cset 15 $base3

0
17.08.2016, 21:42
2 ответа

Если имя и WO всегда идут подряд, это довольно просто:

sed  '/frank;WO12345;/s/;$/;sometext/' -i file

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

sed  '/;frank;/{/;WO12345;/s/;$/;sometext/}' -i file
2
28.01.2020, 02:27

awk лучше подходит для данных, разделенных полями.

Использование awk :

awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt

замените ; Foobar тем, что вы хотите вставить в конец.

Здесь мы проверяем, соответствуют ли ; разделенные 3-е и 4-е поля желаемым строкам, если это так, строка ; Foobar добавляется в конец.

Последняя версия GNU awk (> = 4.10) имеет параметр редактирования на месте:

awk -i inplace -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt

Если у вас его нет, используйте sponge из GNU moreutils или временный файл:

awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt | sponge file.txt

awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' \
       file.txt >file_temp.txt && mv file_temp.txt file.txt

Если вы настаиваете на sed :

sed -Ei '/^([^;]*;){2}frank;WO12345;/ s/$/;Foobar/' file.txt
  • ([^;] *;) {2} соответствует первым двум полям, а затем мы проверили, соответствует ли третье и четвертое поля требуются, а затем выполняется замена

Пример:

$ cat file.txt
1;1471375551;joe;WO12344;
2;1471378551;frank;WO12345;1471380211
3;1471383211;frank;WO12345;1471385211
4;1471385311;frank;WO12345;
5;1471385311;joe;WO12346;1471388211

$ awk -F';' '$3=="frank" && $4="WO12345" {print $0 ";Foobar"}' OFS=';' file.txt
2;1471378551;frank;WO12345;1471380211;Foobar
3;1471383211;frank;WO12345;1471385211;Foobar
4;1471385311;frank;WO12345;;Foobar

$ sed -E '/^([^;]*;){2}frank;WO12345;/ s/$/;Foobar/' file.txt
1;1471375551;joe;WO12344;
2;1471378551;frank;WO12345;1471380211;Foobar
3;1471383211;frank;WO12345;1471385211;Foobar
4;1471385311;frank;WO12345;;Foobar
5;1471385311;joe;WO12346;1471388211
1
28.01.2020, 02:27

Теги

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