Как удалить строку с переменным поиском с помощью команды sed

Я новичок в sed . Что не так с командой sed при удалении строки, которая соответствует входным данным?

InputData.txt

 123, 1234, 1453, 

Datatodelete.txt

 1234,hellofirstline 123,hellosecondline 14676,hellothirdline 1453,hellofourthline 

ожидаемый результат в файле Datatodelete.txt

 14676,hellothirdline 

Автор сценария:

 echo "the script starts now" while read EachLine do echo $EachLine sed "/$EachLine/d" < /home/Datatodelete.txt >/home/dummy done < /home/InputData.txt 

3 Solutions collect form web for “Как удалить строку с переменным поиском с помощью команды sed”

Ваша команда sed не работает, потому что во время цикла каждый раз, когда она читает строку, она удаляет эту строку (и только ту строку) из полного входного файла, выводя ее в /home/dummy . Это означает, что выходной файл каждый раз перезаписывается. Таким образом, первая итерация цикла удаляет строку, начинающуюся с 123, но затем вторая итерация использует исходный полный файл, который по-прежнему включает эту строку.

Попробуйте вместо этого grep :

 grep -vFf /home/InputData.txt /home/Datatodelete.txt > /home/dummy 

От man grep :

  -F, --fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.) -f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.) -v, --invert-match Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX.) 

Версия awk :

 awk -F, 'FNR==NR{a[$1];next} !($1 in a)' InputData.txt Datatodelete.txt 

Во-первых, вы не хотите, чтобы while read там где-либо – sed прочитает ваш файл. Затем вам нужно убедиться, что вы обрабатываете greedy совпадения – sed будет тянуть как можно больше. Так

  echo 1234 | sed -n '/123/p' 1234 

Видеть? Он печатает его.

Поэтому вам нужно, основываясь на том, что вы показали, примерно так:

  </home/InputData.txt \ sed -n '/1234/s//& hellofirstline/p;\ /123[^4]/s//& hellosecondline/p;\ /14676/s//& hellothirdline/p;\ /1453/s//& hellofourthline/p' >/home/dummy 

Если ваш скрипт sed находится в файле:

  </home/InputData.txt \ sed -nf ./delete.sed >/home/dummy 
  • скрипт для замены команды mkdir -p
  • Как изменить (не добавлять) числовую переменную?
  • Создание множества файлов со случайным контентом
  • Необходимо улучшить функцию urlencode
  • Как кот командный файл?
  • Скрипт для распознавания жестких дисков и запуск Smartctl
  • Введите URL-адрес и статус HTTP-статуса
  • Как перенаправить вывод команд Linux на конкретную строку и столбец в csv?
  • Как удалить каталоги в правильном порядке, чтобы удалить пустые?
  • Поиск совпадающих файлов с подстановочными знаками без использования find в сценарии bash
  • Сценарий оболочки слишком медленный для вывода в Conky
  • Linux и Unix - лучшая ОС в мире.