Оболочка: Как заменить поле текста, оставляя то же пустое пространство - PullRequest
1 голос
/ 07 сентября 2010

Я хочу заменить определенное поле текста, сохраняя при этом тот же пробел:

Например, мой текст:

Please              help         me     with this problem
Any                 suggestion   or     help will be appreciated
Thanks              to           all    who  give help

И я хочу заменить предложение "Любое предложение или помощь будут оценены "с" Я хочу решение "

Так что текст будет:

Please              help         me     with this problem
I                   want         the    solution
Thanks              to           all    who  give help

У меня есть решение:

awk '{if($1=="Any" && $2=="suggestion" && $3=="or" && $4=="help"  {$1="I";$2="want";$3="the";$4="solution"};print $0}' eg.txt

Я получу

Please              help         me     with this problem
I want the solution will be appreciated
Thanks              to           all    who  give help

Как видите, у него две проблемы

(1) пробел не одинаков с другими.

(2)$ 5, $ 6, $ 7 " будут оценены " из прежней строки все еще сохраняются.

Я знаю другое решение:

awk '{if($1=="Any" && $2=="suggestion" && $3=="or" && $4=="help"  print "I                   want         the    solution";print $0}' eg.txt 

решит проблемуНо мне просто интересно, есть ли лучший способ?Большое спасибо за ваше внимание!

1 Ответ

3 голосов
/ 07 сентября 2010

Вот пример в awk. Этот код использует предложение Джонатана о printf со спецификатором ширины. match используется для поиска правильной ширины.

#!/usr/bin/awk -f
BEGIN {
    n1 = split("Any suggestion or help will be appreciated", a1)
    split("I want the solution", a2)
}
{
    j = k = 0
    if (NF != n1)
        k  = 1
    for (i = 1; k == 0 && i <= NF; i++)
        if ($i != a1[i])
            k = 1
    if (k) {
        print
        next
    }
    for (i = 1; i <= NF; i++) {
        match(substr($0, j), /[^ ]+ */)
        printf "%-*s", RLENGTH, a2[i]
        j += RLENGTH
    }
    print ""
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...