Разделить каждое совпадение sed

Возможно, я бы сделал так

found=$(find <path to files> -maxdepth 1 -not \( -user root -group root \) -printf "x")
found=${found:+Fail}
echo ${found:=Pass}

Однако самый простой способ изменить сценарий —:

found="Pass"

for x in $(ls -llA <path to files> | awk 'FNR>2{ print $3,$4 }' )
do 
   if [ "${x}" != "root" ]
   then
       found="Fail"
       break
   fi
done

echo $found

Здесь я добавил флаг A, чтобы перехватывать файлы, начинающиеся с "."

Однако делать это таким образом не рекомендуется, так как имена файлов, содержащие новую строку, приведут к неожиданным результатам.

0
26.03.2020, 07:05
2 ответа

Учитывая сложный набор требований, awk лучше подходит для решения этой проблемы.

Эквивалентом печати sed от начала до конца является (в awk):

$ awk '/^ddd/{p=1};p;/^[/]ddd/{p=0}' file
ddd    Start of Match group #1
eee
fff
/ddd   End of Match group #1
ddd    Start of Match group #2
iii
yyy
/ddd   End of Match group #2

Использование ^гарантирует, что amtch находится в начале строки, а [\]будет соответствовать только \также в начале строки.

Переключая тесты, мы можем удалить начальную и конечную линии:

$ awk '/^[/]ddd/{p=0};p;/^ddd/{p=1}' file
eee
fff
iii
yyy

Осталось проверить, (находится ли внутри одного диапазона )какая-либо строка с fff. Это можно сделать с помощью:

awk ' /^[/]ddd/{p=0;if(found==0){print NR};found=0};
      p&&($0~/fff/){found=1};
      /^ddd/{p=1}
    ' file

Будет напечатан номер строки (NR )последней строки группы, не содержащей fffвнутри.

0
19.03.2021, 02:32

Попробуйте

sed -n '/ddd/ {:L; N; /\/ddd/!bL; /fff/ !{p; =;} }' file

При обнаружении dddон собирает строки до /dddв пространстве шаблонов, затем проверяет fffи, если отсутствует, печатает группу и номер последней строки группы.

0
19.03.2021, 02:32

Теги

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