LINUX.ORG.RU
function exclude()
{
  while IFS="" read -r line
  do
    for a in "${@}"
    do
      if grep -qE "^${a}\$" <<< "${line}"
      then
        continue 2
      fi
    done
    echo "${line}"
  done
}

Работает

$ echo -e 'one\ntwo\nthree\nfour' | exclude two three
one
four

Ещё поправил, чтобы он только с целой строкой работал

echo -e 'one\ntwo two\nthree\nfour' | exclude two one
two two
three
four

Всё

egzakharovich
()
Последнее исправление: egzakharovich (всего исправлений: 5)
Ответ на: комментарий от drl

grep может и список для поиска/исключения принимать, причём целыми двумя способами - через списочную регулярку и через файл со списком

Но я тоже возражу - оба этих способа в твоём случае неудобные.

А в том, который предложил выше egzakharovich - баг. Чтобы сделать без бага придётся возиться с генерацией правильной регулярки вместо ^$a\$.

Лучше всего напиши на Си этот exclude - это будет явно лучше чем баш-костыли.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от drl

Я тут разницы не вижу. В курсе про word splitting? В итоге, это превратится в 2 аргумента.

А даже если опустить этот момент, то можно разбить на строки с помощью set и IFS=$'\n'.

У меня ощущение, что хотите на всё готовенькое.

Это так-то проблема уровня «Спроси ChatGPT»

egzakharovich
()
Последнее исправление: egzakharovich (всего исправлений: 1)
Ответ на: комментарий от firkax

А в том, который предложил выше egzakharovich - баг. Чтобы сделать без бага придётся возиться с генерацией правильной регулярки вместо ^$a\$.

Ну я может с grep перемудрил, там можно и [[ "${a}" == "${line}" ]] использовать.

egzakharovich
()
Ответ на: комментарий от vel

Тем что от отсеит не только aa но и baab, aa3 итд. Тут придётся делать регулярку чтоб ему указать что это должна быть полная строка, а раз регулярку - то надо экранировать ещё какие-то символы, которые я сходу даже не перечислю и выглядеть всё это будет стрёмно. Лучше на Си сразу.

firkax ★★★★★
()