Сценарий оболочки, чтобы добавить или заменить блок текста?

Это скорее дополнительный анализ, чем фактический ответ, но он, по-видимому, варьируется в зависимости от сортируемых данных. Во-первых, база, читающая:

$ printf "%s\n" {1..1000000} > numbers.txt

$ time python sort.py s1.txt
real    0m0.521s
user    0m0.216s
sys     0m0.100s

$ time sort s2.txt
real    0m3.708s
user    0m4.908s
sys     0m0.156s

ОК, питон намного быстрее. Тем не менее, вы можете сделать coreutils сортировать быстрее, сказав ему, чтобы сортировать численно:

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s

Это намного быстрее, но питон по-прежнему выигрывает с большим отрывом. Теперь давайте попробуем еще раз, но с несортированным списком 1M чисел:

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s

coreutils sort -n быстрее для несортированных числовых данных (хотя, возможно, вы сможете настроить параметр сортировки python cmp , чтобы сделать его более быстрым). Coreutils сортировка все еще значительно медленнее без флага -n . Итак, как насчет случайных символов, а не чистых чисел?

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s

Python все еще бьет кореутиль, но с гораздо меньшим отрывом, чем то, что вы показываете в вашем вопросе. Удивительно, но это все еще быстрее, если смотреть на чисто алфавитные данные:

$ tr -dc 'A-Za-z'  letters.txt

$ time sort   s2.txt 
real    0m2.561s
user    0m3.684s
sys     0m0.100s

$ time python sort.py s1.txt
real    0m1.297s
user    0m0.744s
sys     0m0.064s

Также важно отметить, что они не дают одинаковых отсортированных выходных данных:

$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b

Как ни странно, вариант -buffer-size , похоже, не сильно (или не сильно) отличался в моих тестах. В заключение, предположительно из-за различных алгоритмов, упомянутых в ответе goldilock, питон сортировать кажется в большинстве случаев быстрее, но числовой GNU сортировать бьет его по несортированным числам 1 .


OP, вероятно, нашел первопричину , но ради полноты, вот окончательное сравнение:

$ time LC_ALL=C sort   s2.txt 
real    0m0.280s
user    0m0.512s
sys     0m0.084s


$ time LC_ALL=C python sort.py   s2.txt 
real    0m0.493s
user    0m0.448s
sys     0m0.044s

1 Кто-то с большим количеством python-fu, чем я должен попытаться проверить настройки list.sort () , чтобы увидеть ту же скорость может быть достигнута путем указания метода сортировки.

-121--2387-

Можно использовать команду get pid running location, используя команды

ls -l/ proc/PID_id/cwd

0
15.12.2014, 08:21
2 ответа

ed - "стандартный текстовый редактор". На самом деле он не идеален для повседневного редактирования, но он легко читается.

ed file.c <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

Первая команда удаляет из первой строки, вплоть до первой строки, содержащей */*, и / необходимо экранировать). Вторая команда представляет собой простую вставку -- i указывает ed на вход в режим "вставка", в то время как . Собственная команда указывает ed на выход из режима вставки. w означает 'запись' и сохранение файла; q означает 'выход'. Все это находится в 'here-document', который начинается и заканчивается на EOF (это произвольно; вы можете использовать любую строку).

Это можно достаточно легко использовать в цикле:

for f in ./*.{c,h}; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

Если вам нужна рекурсивность (т.е. работа в поддиректориях), либо используйте shopt -s globstar и используйте ./**/*.{c,h} в вышеприведенной команде, либо используйте find и некоторое время цикла:

find . -name '*.c' -name '*.h' -print0 | while read -d '' f; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

Если вы можете делать это много раз, возможно, стоит поместить это в скрипт.

#!/bin/sh
ed "$1" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

Если вы назовёте это что-то вроде copyright.sh, поместите это где-нибудь в вашем $PATH, и сделаете его исполняемым, то вы можете просто:

shopt -s globstar
for f in ./**/*.{c,h}; do copyright.sh "$f"; done
2
28.01.2020, 02:36

Немного грязновато, но этот питон будет работать:

#!/usr/bin/python
import sys
filename = sys.argv[1]
fo=open(filename,'r+')
fr=fo.read()
frs=fr.replace('/* --------------------------------------------------\n                Copyright 2014 Author name\n\n                All rights reserved\n             ----------------------------------------------------*/','/* Copy right text bla bla bla\n* some license text bla bla bla\n* All rights reserved xyz xyz */')
fo.seek(0,0)
fo.write(frs)
fo.close()

Это работает, если исходный текст и заменяющий его текст точно в том же формате (включая строки дефиса), что и заданный в вопросе. Вызовите этот питон из каталога, в котором находятся файлы, используя:

for i в ./{*.c,*.h}; do python $i; done

How it works:

Straightforward. Он просто открывает файлы и заменяет строки, приведенные между первой парой одиночных кавычек в frs=fr.replace..... строку со строками, заданными во второй паре одинарных кавычек, заданных в той же строке.

0
28.01.2020, 02:36

Теги

Похожие вопросы