나는 모두 동일한 변경 사항이 필요한 파일 묶음(45개, 미친 짓하지 않고 수동으로 편집하기에는 너무 많음)을 가지고 있습니다(이 질문 끝에 세 가지 차이점이 표시됨).
대부분의 명령줄 검색 및 바꾸기 도구는 줄 단위 바꾸기만 지원하므로 작동하지 않습니다.
작업을 수행할 수 있는 명령줄 도구가 있습니까? 기본적으로 전체 정규식을 한 줄에 넣지 않고 여러 줄의 정규식 검색 및 역참조 대체를 수행하는 것(즉, 파일이나 표준 입력에서 읽어야 함)이면 충분하지만 이를 가능하게 하는 더 나은 솔루션이 있을 수 있습니다. .
--- a/editfile.html
+++ b/editfile.html
@@ -60,7 +60,5 @@
<script type="text/javascript">
- $(document).ready(function() {
- editFileInit(opts);
- });
+ initPage('editFile', opts);
</script>
{% endblock %}
diff --git a/gallery.html b/gallery.html
index 4a07f70..81084ad 100644
--- a/exodus/templates/gallery.html
+++ b/exodus/templates/gallery.html
@@ -87,9 +87,7 @@
<script type="text/javascript">
- $(document).ready(function() {
- galleryInit({
- editTitleUrl: {{ csrf_url_for('gallery_editpictitle')|tojson|safe }},
- delPicUrl: {{ csrf_url_for('gallery_delpic')|tojson|safe }}
- });
+ initPage('gallery', {
+ editTitleUrl: {{ csrf_url_for('gallery_editpictitle')|tojson|safe }},
+ delPicUrl: {{ csrf_url_for('gallery_delpic')|tojson|safe }}
});
</script>
diff --git a/stream_history.html b/stream_history.html
index 783fea4..ea837fa 100644
--- a/exodus/templates/stream_history.html
+++ b/exodus/templates/stream_history.html
@@ -25,8 +25,6 @@
<script type="text/javascript">
- $(document).ready(function() {
- songHistoryInit({
- dataURL: {{ url_for('stream_history_json')|tojson|safe }}
- });
+ initPage('songHistory', {
+ dataURL: {{ url_for('stream_history_json')|tojson|safe }}
});
</script>
들여쓰기가 유지되지 않으면 큰 문제가 되지 않습니다.
답변1
:ex 모드를 사용하여 vi에서 수행할 수 있는 모든 작업을 스크립트로 변환할 수 있습니다.편집하다
ed
하지만 vi
귀찮은 사용자 친화적인 인터페이스가 방해가 되어 속도를 늦추지는 않습니다.
농담은 제쳐두고 ed
텍스트 파일 스크립트 편집에 유용한 도구입니다.
답변2
간단하게 설명하겠습니다. 파일은 메모리에 적합하므로 한 줄씩 읽거나 그와 유사한 것을 읽지 마십시오. 진주의-p
(파일 내용 반복) 스위치 및-0777
"흡연 모드"(한 줄씩 읽는 대신 전체 파일을 한 번에 읽는 것)이 편리합니다.
여러 파일에 대해 작동하며 사용하기 쉽습니다.-i
(파일을 제자리에서 편집).
교체를 수행하려면 다음을 사용하십시오.s
교체 연산자. 바라보다perlre#수정자msx
수정 자 에 대한 설명
perl -0777 -i.orig -p -e '
s[
^(\s+) # indentation
\Q$(document).ready(function() {\E\n
\s*(\w+)Init # function name
(\(((?:(?>[^()]+)|(?3))*)\)) # balanced parentheses
;\n\s*\}\);
][
${1}initPage(\x27$2\x27, $3);
]msx;
' **/*.js
**/*.js
.js
현재 디렉터리와 해당 하위 디렉터리의 모든 파일을 재귀적으로 일치시킵니다. 이것은 zsh에서 바로 사용할 수 있습니다. Bash를 사용하는 경우 shopt -s globstar
이를 ~/.bashrc
.
(테스트되지 않았으므로 정규식을 약간 조정해야 할 수도 있습니다.)
답변3
출력을 표준 출력으로 덤프하므로 파일이 삭제되지 않습니다.
#!/usr/bin/perl
use strict;
use warnings;
# Slurp our input...
my $text = do {local $/; <> };
# Extract the varying parts: foo and bar, for fooInit(bar)
my ($init_prefix, $init_opts) = $text =~ m/([a-zA-Z0-9]+)Init\(([^;]+;)/m;
# Construct the replacement: fooInit(bar) -> initPage('foo', bar)
my $replace_with = "initPage('$init_prefix', $init_opts";
# Target the text to replace...
my $to_replace = '\$\(document.*;';
# Perform the replacement;
$text =~ s/$to_replace/$replace_with/gs;
print $text;
세 가지 예제를 모두 테스트했습니다. 코드가 정확하고 교체의 첫 번째 줄이 올바른 위치에서 시작되지만 교체 줄은 올바르게 들여쓰기되지 않습니다.
$ perl replace.pl 1.js
script type="text/javascript">
initPage('editFile', opts);
</script>
{% endblock %}
$ perl replace.pl 2.js
<script type="text/javascript">
initPage('gallery', {
editTitleUrl: {{ csrf_url_for('gallery_editpictitle')|tojson|safe }},
delPicUrl: {{ csrf_url_for('gallery_delpic')|tojson|safe }}
});
</script>
$ perl replace.pl 3.js
<script type="text/javascript">
initPage('songHistory', {
dataURL: {{ url_for('stream_history_json')|tojson|safe }}
});
</script>