sed 's/linux-[^ ]* //g'
[^ ]*
соответствует всем последующим символам, которые не являются пробелами, а *
после этого означает один или несколько
Вы также можете использовать awk
:
awk 'NR==FNR { nums[$0]; next } !(FNR in nums)' linenum infile
в конкретном случае, когда файл 'linenum' может быть пустым, awk пропустит его, поэтому он не будет печатать целые строки 'infile', тогда, чтобы исправить это, используйте команду ниже:
awk 'NR==FNR && FILENAME==ARGV[1]{ nums[$0]; next } !(FNR in nums)' linenum infile
или даже лучше (благодаря Стефану Шазеласу):
awk '!firstfile_proceed { nums[$0]; next }
!(FNR in nums)' linenum firstfile_proceed=1 infile
Используйте sed для написания программы sed.
sed "$(sed 's/$/d/' A.txt)" B.txt > C.txt
«Программу» можно сделать более сложной, например, она может проверять, что строки являются только числами, или изобретать синтаксис для комментариев и удалять их.
for i in `cat fileA`; do sed -n ''$i'p' fileB; done >>content.txt
for i in `cat content.txt`; do sed -i '/^'$i'$/d' fileB;done
output
B
C
Другой способ сделать это:объединение основных команд оболочки:
join -v1 <(nl file) line_numbers | cut -d' ' -f2-
или:
nl file | join -v1 - line_numbers | cut -d' ' -f2-
Используйте nl
для нумерации строк файла, а затем join -v1
сохранит только строки без совпадений во втором файле, наконец, cut
номер строки. Файл line_numbers
должен быть отсортирован.