Как использовать awk или sed, добавить контент перед последним символом} в тексте - PullRequest
2 голосов
/ 19 января 2020

мой файл a.txt:

{}
{}
{}

Я хочу вставить содержимое непосредственно перед} в последней строке.

{}
{}
{content}

Как использовать sed или awk?

Я начал пробовать sed, но он будет добавлять содержимое перед} в каждой строке. Это код:

sed -i "s/}$/content&/$g"

Ответы [ 3 ]

2 голосов
/ 19 января 2020

Не могли бы вы попробовать следующее решение tac + awk.

tac Input_file | awk 'FNR==1{sub(/}/,"content&")} 1' | tac

2-е решение: Использование GNU sed + tac здесь.

tac Input_file | sed '1 s/}/content&/' | tac
1 голос
/ 20 января 2020

Это может работать для вас (GNU sed):

sed -z 's/\(.*\)}/\1content}/' file

Забросить файл в память и вставить content перед последним }

Альтернатива, возможно, более эффективная память :

sed -n 'x;/}/{x;//{x;p;x;:a;h};//!H;$!b;x;s//content&/p;d};x;//ba;p' file

Используйте пробел для хранения строк, начинающихся со строки, содержащей }. Если область удержания уже содержит строки, а текущая строка содержит }, выведите эти строки и начните заново с sh с текущей строки. В конце файла вернитесь в область удержания (если она не пустая) и вставьте content перед }.

1 голос
/ 19 января 2020

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

sed "$s/}$/content&/g"

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

cat <<EOF |
{}
{}
{}
sometext
EOF
sed -n '
    # if the line contains }
    /}/{
        # if there is anything in hold space, print it
        x
        /^$/!p
        x
        # hold current line
        h
        # read next line
        b
    }
    # if the line does not contain }, hold it
    H
    # if this is the last line
    ${
        # take hold space
        x
        # replace the } with content}
        # there should be only one }
        s/}/content}/
        # print it
        p
    }
'

на выходах repl :

{}
{}
{content}
sometext

Итак, вкладчик: sed -n '/}/{x;/^$/!p;x;h;b};H;${x; s/}/content}/ ;p}'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...