Trích xuất văn bản giữa ba dấu ngoặc đơn


8

Tôi có những điều sau đây trong một tập tin

description: '''
        This rule forbids throwing string literals or interpolations. While
        JavaScript (and CoffeeScript by extension) allow any expression to
        be thrown, it is best to only throw <a
        href="https://developer.mozilla.org
        /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects,
        because they contain valuable debugging information like the stack
        trace. Because of JavaScript's dynamic nature, CoffeeLint cannot
        ensure you are always throwing instances of <tt>Error</tt>. It will
        only catch the simple but real case of throwing literal strings.
        <pre>
        <code># CoffeeLint will catch this:
        throw "i made a boo boo"

        # ... but not this:
        throw getSomeString()
        </code>
        </pre>
        This rule is enabled by default.
        '''

với một số thứ khác trong tập tin này

Tôi trích xuất phần này trong tập lệnh shell của mình thông qua sed -n "/'''/,/'''/p" $1( $1tập tin ở đâu).

Điều này cho tôi một biến với nội dung là một lớp lót

description: ''' This rule forbids throwing string literals or interpolations. While JavaScript (and CoffeeScript by extension) allow any expression to be thrown, it is best to only throw <a href="https://developer.mozilla.org /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects, because they contain valuable debugging information like the stack trace. Because of JavaScript's dynamic nature, CoffeeLint cannot ensure you are always throwing instances of <tt>Error</tt>. It will only catch the simple but real case of throwing literal strings. <pre> <code># CoffeeLint will catch this: throw "i made a boo boo" # ... but not this: throw getSomeString() </code> </pre> This rule is enabled by default. '''

Làm thế nào bây giờ tôi có thể trích xuất phần giữa '''?

Hoặc thậm chí có một cách tốt hơn để lấy nó từ tệp multiline?

Tôi đang dùng Mac El Captain 10.11.2 và GNU bash, phiên bản 3.2.57 (1) -release (x86_64-apple-darwin15)


3
Đặt dấu ngoặc kép xung quanh biến, nó chứa dòng mới sau đó.
DisplayName

1
Đây là YAML, phải không? Bất kỳ lý do nào bạn không thực sự sử dụng trình phân tích cú pháp YAML?
Charles Duffy

@DisplayName, ... để rõ ràng, ý bạn là dấu ngoặc kép khi lặp lại , phải không?
Charles Duffy

Câu trả lời:


12
perl -l -0777 -ne "print for /'''(.*?)'''/gs" file

sẽ trích xuất (và in theo sau là một dòng mới) phần giữa mỗi cặp '' '.

Cẩn thận perlvới toàn bộ tập tin trong bộ nhớ trước khi bắt đầu xử lý nó để giải pháp có thể không phù hợp với các tệp rất lớn.


7

Hãy thử điều này, nếu bạn có gawkhoặc mawktheo ý của bạn:

gawk -v "RS='''" 'FNR%2==0' file

Điều này giả định rằng không có '''-s khác trong tệp.

Giải thích: Nó đặt dấu tách bản ghi thành ba dấu ngoặc đơn và in nếu số bản ghi là số chẵn.

Thật không may, nó sẽ không hoạt động với tất cả các awktriển khai, vì Bộ tách bản ghi nhiều ký tự không phải là một phần của POSIX awk.


(của tôi) Mac terminal không biết gawk mỗi mặc định.
Cod Emerson

4

Không đẹp như câu trả lời awk nhưng như ban đầu bạn đang sử dụng sed

/'''/{
   s/.*'''//
   :1
   N
   /'''/!b1
   s/'''.*//
   p
}
d

Hoặc ngắn hơn như được chỉ ra bởi glenn jackman trong các bình luận (thay đổi một chút)

/'''/,//{
//!p
}
d

Chạy như

sed -f script file

Đầu ra

    This rule forbids throwing string literals or interpolations. While
    JavaScript (and CoffeeScript by extension) allow any expression to
    be thrown, it is best to only throw <a
    href="https://developer.mozilla.org
    /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects,
    because they contain valuable debugging information like the stack
    trace. Because of JavaScript's dynamic nature, CoffeeLint cannot
    ensure you are always throwing instances of <tt>Error</tt>. It will
    only catch the simple but real case of throwing literal strings.
    <pre>
    <code># CoffeeLint will catch this:
    throw "i made a boo boo"

    # ... but not this:
    throw getSomeString()
    </code>
    </pre>
    This rule is enabled by default.

1
Bạn có thể ngưng tụ sed đó sed -n "/'''/,//{//!p}"- có lẽ phải làm set +Htrước tiên trong bash để tắt mở rộng lịch sử.
glenn jackman

@glennjackman Đó là lý do tôi đã đưa nó vào một tập lệnh, IMO nó luôn dễ đọc hơn và miễn nhiễm với các chức năng shell như Globing, mở rộng, v.v ... Dù sao tôi đã thêm nó vào câu trả lời của mình vì nó ngắn gọn hơn so với kịch bản gốc của tôi.
123
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.