sed + как указать sed игнорировать добавление, когда строки уже существуют?

Если у вас Bash v4 (или выше ), я думаю, вы также можете сделать это с помощью одного цикла, ищущего все *.gridфайлы, плюс один внутренний цикл для всех каталогов, чтобы перечислить, в каких каталогах есть файлы, а в каких не надо. В Bash v4 мы используем одну из его опций, которая обычно отключена.

(
# 'globstar' enables '**' expansions, which instructs
# the shell to search all and below recursively
shopt -s globstar

# Note that '**' is implicitly recursive, no need to specify
# depth. If you do want to specify precise depth, then use a
# '*/' for each wanted depth, like '*/*/*/' for 3 depths
for f in /work/user/folder1/**/*.grid; do
    f="${f##*/}"  # strip directory from found name
    printf '\nNow looking for: %s\n' "$f"
    # A simple '**/' returns directories only
    for d in /work/user/folder1/**/; do
        # simple existence test
        [ -e "${d}${f}" ] && \
            printf '    present in %s\n' "$d" || \
            printf 'not present in %s\n' "$d"
    done
done
)

К сожалению, синтаксис **не соответствует POSIX.

Однако, если вы знаете точную глубину поиска, просто уберите команду shoptи превратите каждый **/в точную глубину, выраженную как */повторений, и это должно хорошо работать и в оболочках POSIX..

0
10.05.2021, 10:53
1 ответ

Я упрощу и назову вашу строку exec просто «exec», а предшествующие строки (с экспортами )«pre1» и «pre2».

Вы можете «пропустить» две строки в /pre1/, загрузив их в область удержания и выполнив «пустую» командуb:

 sed '/pre1/{N;N;b};/exec/ipre1\npre2'

Таким образом, команда для /exec/запускается только тогда, когда /pre1/не соответствует.

Предполагается, конечно, что у вас есть либо

 pre1
 pre2
 exec

или просто

 exec

только и никогда "pre1" или "pre2" в другом порядке, только один из них или любой из них где-то еще в файле.

2
28.07.2021, 11:33

Теги

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