3

У меня есть дерево каталогов файлов, мне нужно перебрать и переформатировать строки. Могу ли я сделать это с помощью sed с помощью некоторой комбинации find?

для каждого файла мне нужно откорректировать текст в файле из

...
* @category Foo
* @package Bar
...

в это (удалите строку @category, но добавьте значение к значению аннотации пакета)

...
* @package Foo/Bar
...

Каков наиболее эффективный способ сделать это? это несколько сотен файлов, которые будут изменены.

3 ответа3

2

Попробуй это:

sed '/@category/{s/.*@category /* @package /;N;s/\n.*@package /\//}'

Чтобы запустить это для всех файлов в целом дереве, я бы сделал что-то вроде этого:

for i in $(find . -type f); do
   sed '/@category/{s/.*@category /* @package /;N;s/\n.*@package /\//}' $i > $i.new
   mv $i.new $i
done
0

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

find . -type f -exec sed -ri '$!N;s/^\* @category (.*)\n(\* @package )(.*)/\2\1\/\3/;P;D' {} \;
-1

Когда вам приходится работать над несколькими строками, на ум приходит , для этого лучше, чем sed .

awk '/^\* +@package/{print $0"/"v;next} {if ($0 ~ /^\* +@category/){v=$3}else{print}}' file.txt

Или разлагается:

awk '
    /^\* +@package/{
        print $0"/"v
        next
    }
    {
        if ($0 ~ /^\* +@category/){
            v=$3
        }
        else{
            print
        }
    }
' file.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .