Bash регулярное выражение найти и заменить - PullRequest
2 голосов
/ 30 сентября 2011

Я не знаю, возможно ли это, но можете ли вы динамически изменить поиск / замену?По сути, у меня есть что-то вроде

<3 digit number> <data>

, и я хочу, чтобы данные соответствовали шаблону

<word>:<4 digit number>

, заменив все экземпляры (во всем файле) <word>: на3-значный номер строки IE:

020 Word
021 Word:0001
Replace with 
020 021
021 0210001

Это возможно с AWK или Sed?Если нет, это выполнимо в C?

Ответы [ 5 ]

3 голосов
/ 30 сентября 2011

Я знаю, что это не то, что вы просили, но я думаю, что лучший способ решить эту проблему с помощью простого сценария Perl.потому что я сделал его красивым и легким для чтения.

2 голосов
/ 30 сентября 2011

Это решение awk проходит 2 раза через ваш файл: один раз, чтобы найти все Word s, нуждающиеся в замене, и один раз, чтобы действительно заменить:

gawk '
    NR == FNR {
        if (match($2, /^([^:]+):[0-9][0-9][0-9][0-9]$/, a)) 
            repl[a[1] ":?"] = $1
        next
    }
    {
        for (word in repl)
            if ($2 ~ word) {
                sub(word, repl[word], $2)
                break
            }
        print
    }
' filename filename > new.file

Требуется gawk для захвата скобок.

2 голосов
/ 30 сентября 2011
number=$(gawk --posix '/[0-9]{3} '${word}':[0-9]{4}/ { print $1; exit }' $file)

if [ "$number" != "" ]; then
    sed -r "s/${word}:?/${number}/" $file
fi
2 голосов
/ 30 сентября 2011

Надеюсь, на этот раз я понял вас правильно.

попробуйте материал ниже:

#file name:t
kent$  cat t
020 Word
021 Word:0001

#first we find out the replacement, 021 in this case:
kent$  v=$(grep -oP "(\d{3})(?= Word:\d{4})" t|head -n1)

#do replace by sed:
kent$  sed -r "s/Word[:]?/$v/g" t                                                                                                        
020 021 
021 0210001
1 голос
/ 30 сентября 2011

Вот еще одно решение sed:

# sweep the file and make a lookup table variable

lookup=$(sed -nr 's/(.*) (.*:).*/\2\1/p' <source_file |tr '\n' ' ')

# append the lookup to each line and substitute using a backreference
# N.B. remove the lookup whatever!

     sed -r "s/\$/@@${lookup}/;
             s/^(... )(.*)$@@.*\2:(\S*).*/\1\3/;
             s/^(... )(.*:)(.*)@@.*\2(\S*).*/\1\4\3/;
             s/@@.*//" <source_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...