Используйте команду sed для вставки строки во второе вхождение шаблона

С GNU awk

gawk '
    {
         a[length]=$0
    };
    END
    {
        PROCINFO["sorted_in"]="@ind_num_asc";
        for (i in a)
        {
            print a[i]; 
            exit
        }
    }
    ' file
  • Считайте каждую строку в массив, проиндексированный по длине строки.

  • Задайте для PROCINFO["sorted_in"]значение @ind_num_asc, чтобы принудительно массив сканирование для упорядочения по индексу массива,отсортировано численно

  • Установка параметра PROCINFOописанным выше образом заставляет линию с наименьшая длина, которая будет выбрана первой при обходе массива. Итак, выведите первый элемент из массива и выйдите

Недостаток этого метода состоит в том, что он nlognв то время как некоторые другие подходы являются nвременными

.

0
11.10.2020, 14:48
3 ответа

Я беру переменную "contentneed _to _replace" для замены содержимого перед строкой "make PREFIX"

for i in `sed -n '/make PREFIX/{;=;p}' o.txt| sed -n '1~2p'| sed -n '2p'`
do
contentneed_to_replace="praveen"
sed ''$i's/make PREFIX.*/'$contentneed_to_replace'\n&/g' o.txt
done

выход

make PREFIX=/usr                \
 SHAREDIR=/usr/share/hwdata \
 SHARED=yes

 praveen
make PREFIX=/usr                \
 SHAREDIR=/usr/share/hwdata \
 SHARED=yes                 \
 install install-lib
0
18.03.2021, 22:58

heredocs <<— отличный и удобный способ избежать проблем с кавычками и обратной косой чертой в командной строке.

Мы передаем код в sed, который ищет первую команду make, а затем переходит к следующей. В этот момент вставка выполняется, и оттуда он скользит к eof, не беспокоясь ни о чем другом.

sed -f - file <<\eof 
  /make PREFIX=\/usr/!b
  :a;n;//!ba
  i\
sed -e '/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(SBINDIR)/ s/^/#/' \\\
    -e '/\\$(DIRINSTALL) -m 755 \\$(DESTDIR)\\$(LIBDIR)/ s/^/#/' \\\
    -e 's/pci \\$(DESTDIR)\\$(PKGCFDIR)/pci/' \\\
-i Makefile
  :b;n;bb
eof

Это основано на ожидаемом результате.

1
18.03.2021, 22:58

Это должно работать... Пропускается первое вхождение

sed -i -E '0,/make PREFIX/! s/(make PREFIX)/\n\1/' file.txt

файл.txt

make PREFIX=/usr
SHAREDIR=/usr/share/hwdata
SHARED=yes
make PREFIX=/usr
SHAREDIR=/usr/share/hwdata
SHARED=yes
install install-lib
0
18.03.2021, 22:58

Теги

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