Вам не нужно использовать awk
, если все, что вы хотите сделать, это. :) Кроме того, запись в файл, когда вы читаете из него, так, как вы это сделали, приведет к потере или повреждению данных , попробуйте не делать этого.
for file in *.php ; do
# or, to do this to all php files recursively:
# find . -name '*.php' | while read file ; do
# make backup copy; do not overwrite backup if backup already exists
test -f $file.orig || cp -p $file $file.orig
# awk '{... print > NEWFILE}' NEWFILE="$file" "$file.orig"
sed -e "s:include('\./:include(':g" "$file.orig" >"$file"
done
Просто чтобы прояснить аспект потери данных: когда awk
(или sed
) начнет обработку файла и вы попросите их прочитать первую строку, они фактически выполнят буферизованное чтение, то есть они будут читать из файловая система (давайте упростим и скажем «с диска») блок данных размером с их внутренний буфер чтения (например, 4-65 КБ) для повышения производительности (за счет уменьшения дискового ввода-вывода.) Предположим, что файл работа с размером больше, чем размер буфера. Дальнейшие чтения будут продолжать поступать из буфера, пока буфер не будет исчерпан, после чего второй диск данных будет загружен с диска в буфер и т. Д.
Однако, сразу после того, как вы прочитали первую строку, т.е. после того, как первый блок данных прочитан с диска в буфер, ваш скрипт awk
открывает FILENAME
, сам входной файл, для записи с усечением , то есть размер файла на диске сбрасывается до 0 . На этом этапе все, что осталось от вашего исходного файла, это первые несколько килобайт данных в памяти awk
. Awk
будет с радостью продолжать читать строку за строкой из буфера в памяти и производить вывод до тех пор, пока буфер не будет исчерпан, в этот момент awk
, вероятно, остановится и оставит вас с файлом 4-65k.
В качестве примечания: если вы на самом деле используете awk для расширения (например, print "PREFIX: " $0
), а не для сжатия (gsub(/.../, "")
), данных, то вы почти наверняка получите неотвечающий awk
и постоянно растущий файл. :)