regex
  • sed
  • grep
  • wildcard
  • string-substitution
  • 2011-06-06 51 views 5 likes 
    5

    Tôi muốn thực hiện thay thế dựa trên ký tự đại diện. Ví dụ: thay đổi tất cả "tenure" thành "disposition" chỉ khi từ "tenure" xuất hiện sau dấu '='. Về cơ bản một regex mà sẽ phù hợp này =.*tenurethay thế ký tự đại diện sed

    Lệnh sed rằng tôi có nên cho điều này là:

    sed 's/=.*tenure/=.*disposition/g' file.txt 
    

    Tuy nhiên, nếu tôi chuyển thông tin này vào một tập tin có chứa:

    blah blah blah = change "tenure" to "disposition" 
    

    tôi nhận được

    blah blah blah =.*disposition" to "disposition" 
    

    thay vì:

    blah blah blah = change "disposition" to "disposition" 
    

    Làm cách nào để thực hiện thay thế sao cho ký tự đại diện trong regex sẽ không nằm trong tệp đích?

    Trả lời

    6

    Bạn cần phải sử dụng một chụp nhómđể nắm bắt các văn bản xuất hiện giữa những người ngang của bạn ký tên và "nhiệm kỳ".

    Vì vậy

    sed 's/=\(.*\)tenure/=\1disposition/g' 
    

    Lưu ý việc sử dụng \1 để tham khảo và sử dụng nhóm bạn đã chụp.

    Vì vậy, trong

    echo 'blah blah blah = change "tenure" to "disposition"' | sed 's/=\(.*\)tenure/=\1disposition/g' 
    

    chúng tôi nhận

    blah blah blah = change "disposition" to "disposition". 
    

    Xem Regex grouping.

    2
    sed 's/\(=.*\)tenure/\1disposition/g' file.txt 
    
    2

    Bạn cần phải lưu ký tự tương ứng giữa =tenure để thêm chúng vào đầu ra:

    sed 's/=(.*)tenure/=\1disposition/g' file.txt 
    

    Ngoài ra, bạn nên thêm tùy chọn -i để sed nếu bạn muốn chỉnh sửa các tập tin tại chỗ (thực hiện các sửa đổi cho chính tệp đó).

    2

    Bạn phải sử dụng backreference trong sed. Sử dụng nó như thế này:

    sed 's/\(=.*\)tenure/\1disposition/g' 
    
    Các vấn đề liên quan