нужно почистить файл через SED или GREP - PullRequest
1 голос
/ 16 апреля 2019

У меня есть эти файлы

  • NotRequired.txt (со строками, которые необходимо удалить)
  • Need2CleanSED.txt (большой файл, необходимо очистить)
  • Need2CleanGRP.txt (большой файл, необходимо очистить)

содержимое:

more NotRequired.txt
[abc-xyz_pqr-pe2_123]
[lon-abc-tkt_1202]
[wat-7600-1_414]
[indo-pak_isu-5_761]

Я читаю над файлом и хочу удалить строки из Need2Clean???.txt, пытаясь с помощью SEDи GREP, но безуспешно.

myFile="NotRequired.txt"

while IFS= read -r HKline

do

  sed -i '/$HKline/d' Need2CleanSED.txt

done < "$myFile"


myFile="NotRequired.txt"

while IFS= read -r HKline

do

  grep -vE \"$HKline\" Need2CleanGRP.txt > Need2CleanGRP.txt

done < "$myFile"

Похоже, что переменная и символы [] создают некоторые проблемы.

Ответы [ 3 ]

3 голосов
/ 17 апреля 2019

То, что вы делаете, крайне неэффективно и подвержено ошибкам. Просто сделай это:

grep -vF -f NotRequired.txt Need2CleanGRP.txt > tmp &&
mv tmp Need2CleanGRP.txt

Благодаря grep -F все вышеперечисленное обрабатывает каждую строку NotRequired.txt как строку, а не как регулярное выражение, поэтому вам не нужно беспокоиться о экранировании метасхем RE, таких как [, и вам не нужно переносить их в цикл оболочки - эта команда удалит все нежелательные строки за одно выполнение grep.

Никогда не делайте command file > file кстати, так как оболочка может решить сначала выполнить > file и поэтому пусто file до того, как command получит шанс прочитать его! Всегда делайте command file > tmp && mv tmp file вместо этого.

0 голосов
/ 17 апреля 2019

попробуйте GNU SED:

sed -Ez 's/\n/\|/g;s!\[!\\[!g;s!\]!\\]!g; s!(.*).!/\1/d!' NotRequired.txt| sed -Ef - Need2CleanSED.txt

Два процесса sed объединены в одну оболочку
NotRequired.txt 'выкраивается' на sed -z все сразу и заменяет свои мета-символы \n и [ на | и \[ соответственно, из которых 2-й процесс использует его в качестве сценария регулярных выражений для входного файла т.е. Need2CleanSED.txt. Выход 1-го процесса;

/\[abc-xyz_pqr-pe2_123\]|\[lon-abc-tkt_1202\]|\[wat-7600-1_414\]|\[indo-pak_isu-5_761\]/d

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

0 голосов
/ 16 апреля 2019

Ваше предположение верно.Конструкция [...] ищет любые символы в этом наборе, поэтому вы должны предварять («экранировать») их с помощью \.Самый простой способ - это сделать это в исходном файле:

sed -i -e 's:\[:\\[:' -e 's:\]:\\]:' "${myFile}"

Если вам это не нравится, вы, вероятно, можете поместить команду sed туда, куда вы направляете файл:

done < replace.txt|sed -e 's:\[:\\[:' -e 's:\]:\\]:'

Наконец, вы можете использовать sed для каждой HKline переменной:

HKline=$( echo $HKline | sed -e 's:\[:\\[:' -e 's:\]:\\]:' )
...