Как удалить три последовательных перевода строки в правиле Makefile?
Мне нужно найти и заменить три последовательных символа новой строки во входном файле и отфильтровать их из выходного файла для правила make-файла на Centos 4. Я использую GNU sed v4.1.2 и GNU make v3.82. Я пробовал варианты на следующих безуспешно до сих пор:
THREE_LINE_FEEDS := $(shell echo "\012\012\012")
SED_RULE := 's/'$(THREE_LINE_FEEDS)'//'
output.txt: input.txt
sed -r $(SED_RULE) input.txt > output.txt
Используя предложенный perl, я получаю эту проблему в оболочке (адаптированной из моего правила make):
> cat input.txt | perl -e '$/ = undef; _ = <>; s/\n{3}//g; print;' > output.txt
Can't modify constant item in scalar assignment at -e line 1, near "<>;"
Execution of -e aborted due to compilation errors.
2 ответа
Для тех, кто заинтересован, вот собственно правило make-файла (я не смог заставить переводы работать в оригинале, поэтому использовал комментарий для добавления документации):
# 0777 - Enables slurp mode (i.e. $/ = undef; - Slurp mode, read whole file
# $_ = <>; - Read file to $_)
# s/\n{3}//g; - Remove occurrences of \n{3}
# p - Implicitly print result (i.e. print; - Output $_)
output.txt: input.txt
$(SED) -r $(SED_RULE) input.txt | perl -0777 -pe 's/\n{3}//g' > output.txt
sed
видит только одну строку за раз, поэтому поиск последовательных переводов не будет работать. Один из способов - поместить все данные в область удержания, а затем выполнить замену, когда все входные данные будут собраны, например:
sed -r -n '
$! { # When it is not the last line
1 { h } # Replace hold space with first line
1! { H } # Otherwise append to hold space
}
$ { # When last line reached
H # Append it to hold space
g # Replace pattern space with hold space
s/\n{3}//g # Remove all occurrences of \n{3}
p # Print pattern space
}
' input.txt
Вот более простой вариант использования perl
, но работает так же:
perl -e '
$/ = undef; # Slurp mode, read whole file
$_ = <>; # Read file to $_
s/\n{3}//g; # Remove all occurrences of \n{3}
print; # Output $_
' input.txt
редактировать
Короче perl
версия, предложенная Питером О.
perl -0777 -pe 's/\n{3}//g' input.txt
-0777
включает режим глухоты.-p
неявно печатает результат.