여러 파일에서 유사한 교체(diff에는 충분히 간단하지 않음)를 수행하는 현명한 방법은 무엇입니까?

여러 파일에서 유사한 교체(diff에는 충분히 간단하지 않음)를 수행하는 현명한 방법은 무엇입니까?

나는 모두 동일한 변경 사항이 필요한 파일 묶음(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>

관련 정보