С 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
временными
.
Я беру переменную "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
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
Это основано на ожидаемом результате.
Это должно работать... Пропускается первое вхождение
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