Với đầu cuối: Sử dụng Biểu thức chính quy II: Thay thế

Trong bản thân tôi bài trước Tôi đã nói với bạn ở cấp độ cơ bản về cách hoạt động của từng ký tự đặc biệt được sử dụng nhiều nhất của cụm từ thông dụng. Với các biểu thức chính quy này, bạn có thể thực hiện các tìm kiếm phức tạp trong tệp văn bản hoặc trong đầu ra của các lệnh khác. Trong bài viết này, tôi sẽ giải thích cách sử dụng lệnh sed để tìm và thay thế văn bản theo cách mạnh mẽ hơn nhiều so với việc chỉ thay đổi một văn bản này cho một văn bản khác.

Thêm một chút về lệnh grep

Trước khi bắt đầu nói về sed, tôi muốn nhận xét thêm một chút về lệnh grep để hoàn thiện những gì đã được giải thích trong bài viết trước một chút. Mọi điều tôi sắp nói cũng sẽ liên quan đến vấn đề này. Sau đó, chúng ta sẽ thấy mối quan hệ giữa điều này và các tìm kiếm.

Kết hợp các biểu thức chính quy

Nhiều ký tự đặc biệt mà tôi đã đề cập trong bài viết trước có thể được kết hợp, không chỉ với các ký tự khác, mà với toàn bộ cụm từ thông dụng. Cách thực hiện là sử dụng dấu ngoặc đơn để tạo biểu thức con. Hãy xem một ví dụ về điều này. Hãy bắt đầu bằng cách tải xuống một văn bản mà chúng ta có thể sử dụng để thử nghiệm. Nó là một danh sách các cụm từ. Đối với điều đó, chúng tôi sẽ sử dụng lệnh sau:

curl http://artigoo.com/lista-de-frases-comparativas-comicas 2>/dev/null | sed -n 's/.*\(.*\.\)<\/p>/\1/gp' > frases

 Thao tác này sẽ đưa bạn vào thư mục nơi bạn khởi chạy tệp có tên «cụm từ». Bạn có thể mở nó ra để xem và cười một chút. 🙂

Bây giờ, giả sử rằng chúng ta muốn tìm các cụm từ có chính xác 6 từ. Khó khăn là hình thành một biểu thức chính quy phù hợp với từng từ. Một từ là một chuỗi các chữ cái, có thể là chữ hoa hoặc chữ thường, sẽ giống như '[a-zA-Z]+', nhưng bạn cũng phải xác định rằng các chữ cái này phải được phân tách bằng các ký tự khác không phải là chữ cái, nghĩa là nó sẽ giống như '[a-zA-Z]+[^a-zA-Z]+'. Hãy nhớ rằng: "^" là ký tự đầu tiên bên trong dấu ngoặc cho biết rằng chúng ta muốn so khớp với các ký tự không nằm trong phạm vi và "+" cho biết 1 hoặc nhiều ký tự.

Chúng tôi đã có một biểu thức chính quy có thể khớp với một từ. Để ghép nó với 6, nó sẽ phải được lặp lại 6 lần. Đối với điều đó, chúng tôi đã sử dụng các phím, nhưng nó là vô ích '[a-zA-Z]+[^a-zA-Z]+{6}', bởi vì số 6 sẽ lặp lại phần cuối cùng của biểu thức chính quy và những gì chúng tôi muốn là lặp lại tất cả, vì vậy những gì bạn phải đặt là: '([a-zA-Z]+[^a-zA-Z]+){6}'. Với dấu ngoặc, chúng ta tạo thành một biểu thức con và với dấu ngoặc nhọn, chúng ta lặp lại nó 6 lần. Bây giờ bạn chỉ cần thêm dấu "^" ở phía trước và "$" phía sau để khớp toàn bộ dòng. Lệnh như sau:

grep -E '^([a-zA-Z]+[^a-zA-Z]+){6}$' frases

Và kết quả đúng như những gì chúng tôi muốn:

Nó được hát nhiều hơn Macarena. Bạn đã hoàn thiện hơn Luis Aguilé. Bạn có ít văn hóa hơn một hòn đá. Bạn biết nhiều ngôn ngữ hơn Cañita Brava. Anh ta có nhiều nếp nhăn hơn Tutan Khamón. Bạn biết ít hơn Rambo về chăm sóc trẻ em.

Lưu ý rằng chúng tôi đặt tham số -E vì chúng tôi muốn sử dụng các biểu thức chính quy mở rộng để làm cho "+" hoạt động. Nếu chúng ta sử dụng những cái cơ bản, chúng ta sẽ phải thoát khỏi dấu ngoặc đơn và dấu ngoặc nhọn.

Tham chiếu ngược hoặc tham chiếu ngược

Nếu bạn đã cài đặt trình kiểm tra chính tả, bạn có thể sẽ có một danh sách các từ trong /usr/share/dict/words. Nếu không, bạn có thể cài đặt nó trong vòm với:

sudo pacman -S words

Hoặc trong debian với:

sudo aptitude install dictionaries-common

Nếu bạn muốn, bạn có thể nhìn vào tệp để xem nó có những từ nào. Nó thực sự là một liên kết đến tệp word cho ngôn ngữ mà bản phân phối của bạn đang sử dụng. Bạn có thể cài đặt nhiều tệp word cùng một lúc.

Chúng tôi sẽ sử dụng tệp đó. Nó chỉ ra rằng chúng tôi rất tò mò muốn biết tất cả các palindromes bảy chữ cái ngoài kia. Dành cho những ai chưa biết: Palindrome là một từ capicúa, có nghĩa là, nó có thể được đọc từ trái sang phải cũng như từ phải sang trái. Hãy thử lệnh sau:

grep '^\(.\)\(.\)\(.\).\3\2\1$' /usr/share/dict/words

Trông hơi lạ đúng không? Nếu chúng tôi thử nó, kết quả sẽ phụ thuộc vào ngôn ngữ của bản phân phối của bạn và các từ trong danh sách của bạn, nhưng trong trường hợp của tôi, với ngôn ngữ Tây Ban Nha, kết quả là:

anilin cán anilin

Hãy xem biểu thức chính quy này hoạt động như thế nào.

Ngoài "^" và "$", mà chúng ta đã biết nó dùng để làm gì, điều đầu tiên chúng ta thấy ở bên trái là ba nhóm dấu chấm được đặt trong dấu ngoặc đơn. Đừng bối rối bởi các thanh phía trước mỗi dấu ngoặc đơn. Chúng thoát khỏi dấu ngoặc đơn vì chúng ta đang sử dụng các biểu thức chính quy cơ bản, nhưng chúng không có ý nghĩa nào khác. Điều quan trọng là chúng tôi đang yêu cầu bất kỳ ba ký tự nào có dấu chấm, nhưng mỗi dấu chấm đó được đặt trong dấu ngoặc đơn. Điều này là để lưu các ký tự khớp với các điểm đó để chúng có thể được tham chiếu lại từ biểu thức chính quy. Đây là một cách sử dụng khác của dấu ngoặc đơn sẽ có ích trong việc thay thế sau này.

Đây là nơi ba số bên dưới đi kèm với dấu gạch chéo ở phía trước của chúng. Trong trường hợp này, thanh là quan trọng. Điều này cho biết rằng số bên dưới là một tham chiếu ngược và đang tham chiếu đến một trong các dấu ngoặc đơn trước đó. Ví dụ: \ 1 đề cập đến dấu ngoặc đơn đầu tiên, \ 2 đến dấu ngoặc đơn thứ hai, v.v.

Nghĩa là, với biểu thức chính quy mà chúng ta đã đặt, những gì chúng ta đang tìm kiếm là tất cả các từ bắt đầu bằng bốn chữ cái bất kỳ và sau đó có một chữ cái giống với chữ thứ ba, một chữ cái khác giống chữ cái thứ hai và một chữ cái khác giống với Đầu tiên. Kết quả là các palindromes gồm bảy chữ cái có trong danh sách từ. Đúng như chúng tôi muốn.

Nếu chúng ta đang sử dụng biểu thức chính quy mở rộng, chúng ta sẽ không phải thoát khỏi dấu ngoặc đơn, nhưng với các biểu thức chính quy mở rộng thì các tham chiếu ngược lại không hoạt động trong tất cả các chương trình vì chúng không được chuẩn hóa. Tuy nhiên, với grep, chúng hoạt động, vì vậy đó có thể là một cách khác để làm điều tương tự. Bạn có thể thử nó nếu bạn muốn.

Biểu thức thay thế: lệnh sed

Ngoài việc tìm kiếm, một trong những cách sử dụng tốt nhất của cụm từ thông dụng là thay thế các văn bản phức tạp. Để làm điều này, một cách để làm là với lệnh sed. Sức mạnh của lệnh sed vượt xa việc thay thế văn bản, nhưng ở đây tôi sẽ sử dụng nó cho việc đó. Cú pháp mà tôi sẽ sử dụng với lệnh này như sau:

sed [-r] 's/REGEX/REPL/g' FICHERO

Hoặc cũng:

COMANDO | sed [-r] 's/REGEX/REPL/g'

Trong đó REGEX sẽ là biểu thức tìm kiếm thông thường và REPL sẽ là thay thế. Hãy nhớ rằng lệnh này không thực sự thay thế bất kỳ thứ gì trong tệp mà chúng tôi chỉ ra, nhưng những gì nó làm là hiển thị cho chúng ta kết quả của việc thay thế trong thiết bị đầu cuối, vì vậy đừng sợ hãi trước các lệnh mà tôi sắp đặt tiếp theo. Không ai trong số họ sẽ sửa đổi bất kỳ tệp nào trên hệ thống của bạn.

Hãy bắt đầu với một ví dụ đơn giản. Tất cả chúng ta đều có các tệp cấu hình khác nhau trong thư mục / etc thường có chú thích bắt đầu bằng "#". Giả sử chúng ta muốn xem một trong những tệp này mà không có chú thích. Ví dụ, tôi sẽ làm điều đó với fstab. Bạn có thể thử với một trong những bạn muốn.

sed 's/#.*//g' /etc/fstab

Tôi sẽ không đặt ở đây kết quả của lệnh vì nó phụ thuộc vào những gì bạn có trong fstab của mình, nhưng nếu bạn so sánh đầu ra của lệnh với nội dung của tệp, bạn sẽ thấy rằng tất cả các chú thích đã biến mất.

Trong lệnh này, biểu thức tìm kiếm là «#.*", Đó là" # "theo sau bởi bất kỳ số ký tự nào, tức là các nhận xét. Và biểu thức thay thế, nếu bạn nhìn vào hai thanh liên tiếp, bạn sẽ thấy rằng không có thanh nào, vì vậy những gì nó đang làm là thay thế các nhận xét bằng không, tức là xóa chúng. Đơn giản hơn không thể.

Bây giờ chúng ta sẽ làm điều ngược lại. Giả sử rằng những gì chúng ta muốn là nhận xét tất cả các dòng của tệp. Hãy thử như thế này:

sed 's/^/# /g' /etc/fstab

Bạn sẽ thấy rằng, trong đầu ra lệnh, tất cả các dòng đều bắt đầu bằng dấu thăng và khoảng trống. Những gì chúng tôi đã làm là thay thế đầu dòng bằng «# «. Đây cũng là một ví dụ khá đơn giản trong đó văn bản được thay thế luôn giống nhau, nhưng bây giờ chúng ta sẽ phức tạp hơn một chút.

Cơ hội của sự thay thế là trong biểu thức thay thế, bạn có thể sử dụng các tham chiếu ngược như những gì tôi đã nói với bạn trước đây. Hãy quay lại tệp cụm từ mà chúng ta đã tải xuống ở đầu bài viết. Chúng tôi sẽ đặt trong ngoặc đơn tất cả các chữ cái in hoa có, nhưng chúng tôi sẽ thực hiện điều đó bằng lệnh:

sed 's/\([A-Z]\)/(\1)/g' frases

Những gì chúng ta có ở đây là tham chiếu ngược trong biểu thức thay thế tham chiếu đến dấu ngoặc đơn trong biểu thức tìm kiếm. Dấu ngoặc đơn trong biểu thức thay thế là dấu ngoặc đơn bình thường. Trong biểu thức thay thế, chúng không có ý nghĩa đặc biệt, chúng được đặt như vậy. Kết quả là tất cả các chữ cái viết hoa được thay thế bằng cùng một chữ cái đó, bất kể nó là gì, với dấu ngoặc đơn xung quanh nó.

Có một ký tự khác cũng có thể được sử dụng trong biểu thức thay thế, đó là "&" và nó được thay thế bằng tất cả văn bản phù hợp với biểu thức tìm kiếm. Một ví dụ về điều này có thể là đặt tất cả các cụm từ trong tệp trong dấu ngoặc kép. Điều này có thể đạt được với lệnh này:

sed 's/.*/"&"/g' frases

Thao tác của lệnh này rất giống với lệnh trước, chỉ khác là bây giờ thứ chúng ta thay thế là toàn bộ dòng có cùng dòng với dấu ngoặc kép xung quanh nó. Vì chúng ta đang sử dụng "&", chúng ta không cần đặt dấu ngoặc đơn.

Một số lệnh hữu ích với biểu thức chính quy

Dưới đây là một số lệnh mà tôi thấy hữu ích hoặc tò mò và sử dụng biểu thức chính quy. Với các lệnh này, tiện ích của biểu thức chính quy tốt hơn nhiều so với các ví dụ mà tôi đã đưa ra cho đến nay, nhưng đối với tôi, điều quan trọng là phải giải thích điều gì đó về cách hoạt động của biểu thức chính quy để hiểu chúng.

  • Hiển thị các phần của trang người đàn ông:

man bash | grep '^[A-Z][A-Z ]*$'

Tất nhiên, bạn có thể thay đổi lệnh bash thành bất cứ thứ gì bạn muốn. Và sau đó, từ người đàn ông, bạn có thể chuyển trực tiếp đến phần mà bạn quan tâm bằng cách sử dụng, tất nhiên, một biểu thức chính quy. Bạn nhấn «/» để bắt đầu tìm kiếm và viết «^ALIASES$»Để chuyển đến phần ALIASES chẳng hạn. Tôi nghĩ đây là lần sử dụng đầu tiên mà tôi bắt đầu sử dụng biểu thức chính quy cách đây vài năm. Di chuyển qua một số trang của sách hướng dẫn gần như là không thể nếu không có một thủ thuật như thế này.

  • Hiển thị tên của tất cả người dùng của máy bao gồm cả những người đặc biệt:

sed 's/\([^:]*\).*/\1/' /etc/passwd

  • Hiển thị tên người dùng, nhưng chỉ những tên có shell:

grep -vE '(/false|/nologin)$' /etc/passwd | sed 's/\([^:]*\).*/\1/g'

Nó thực sự có thể được thực hiện với một biểu thức chính quy duy nhất, nhưng cách thực hiện nó vượt xa những gì tôi đã nói với bạn trong các bài viết này, vì vậy tôi đã thực hiện nó bằng cách kết hợp hai lệnh.

  • Chèn dấu phẩy trước ba chữ số cuối cùng của tất cả các số trong tệp số:

sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers

Nó chỉ hoạt động với các số có tối đa 6 chữ số, nhưng nó có thể được gọi nhiều lần để đặt dấu phân cách trong các nhóm ba chữ số khác.

  •  Trích xuất tất cả các địa chỉ email từ một tệp:

grep -E '\<[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\>' FICHERO

  • Tách ngày, tháng và năm của tất cả các ngày xuất hiện trong tệp:

sed -r 's/([0-9]{2})[/-]([0-9]{2})[/-]([0-9]{4})/Día: \1, Mes: \2, Año: \3/g' FICHERO

  • Tìm hiểu IP cục bộ của chúng tôi:

/sbin/ifconfig | grep 'inet .*broadcast' | sed -r 's/[^0-9]*(([0-9]+\.){3}[0-9]+).*/\1/g'

Điều này cũng có thể được thực hiện với một lệnh sed duy nhất, nhưng tốt hơn là tôi nên tách nó thành một grep và sed để đơn giản hơn.

Một số địa chỉ hữu ích

Dưới đây là một số địa chỉ có thể hữu ích liên quan đến cụm từ thông dụng:

  • Thư viện biểu thức chính quy: Đây là một thư viện biểu thức chính quy, trong đó bạn có thể tìm kiếm các biểu thức chính quy liên quan đến chủ đề mà bạn quan tâm. Để tìm kiếm địa chỉ web, ID hoặc bất cứ thứ gì.
  • RegExr: Trình kiểm tra biểu thức chính quy trực tuyến. Nó cho phép bạn nhập một văn bản và áp dụng một biểu thức chính quy cho nó hoặc tìm kiếm hoặc thay thế. Nó cung cấp thông tin về biểu thức chính quy và bạn có một số tùy chọn để thay đổi hành vi của nó.
  • Trình kiểm tra biểu thức chính quy: Nó là một addon cho firefox cho phép bạn kiểm tra các biểu thức chính quy từ trình duyệt.

Kết luận

Còn bây giờ thì chỉ có vậy thôi. Biểu thức chính quy rất phức tạp nhưng hữu ích. Cần phải có thời gian để học chúng, nhưng nếu bạn giống tôi, chơi với chúng sẽ có vẻ thú vị và từng chút một bạn sẽ thành thạo chúng. Đó là cả một thế giới. Sẽ có rất nhiều điều để nói về các bộ định lượng lười biếng, regex kiểu PERL, đa dòng, v.v. Và sau đó mỗi chương trình có các đặc điểm và các biến thể của nó, vì vậy lời khuyên tốt nhất mà tôi có thể đưa ra cho bạn là luôn xem tài liệu của chương trình mà bạn đang sử dụng mỗi khi bạn phải viết một biểu thức chính quy trong một chương trình mới.

Chào! …CHÀO! … THỨC DẬY! … TẤT CẢ CÁC BẠN ĐANG LÀM GÌ NGỦ? 🙂

Fuentes

Một số ý tưởng và ví dụ cho cụm từ thông dụng trong bài viết này mà tôi đã lấy từ đây:


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   sống động dijo

    Tinh thông !!!

    1.    lục giác dijo

      Nó không phải là quá tệ, nhưng cảm ơn bạn rất nhiều. Hy vọng mọi người thích nó. 🙂

      1.    oscar dijo

        Tôi thích nó ha!

        1.    lục giác dijo

          Vậy thì tôi phải làm điều gì đó đúng đắn. CƯỜI LỚN!! 🙂

          Rất cảm ơn bạn vì sự góp ý.

          1.    Blaire pascal dijo

            Fuck tiếp tục viết người đàn ông, giữ nó lên.

          2.    lục giác dijo

            @Blaire Pascal: Những bình luận như của bạn khuyến khích nó. 🙂 Xin chân thành cảm ơn !!

      2.    Thành phố dijo

        Tôi cũng thích nó ... cảm ơn 🙂

        1.    lục giác dijo

          Cảm ơn bạn đã bình luận. Tôi hy vọng sẽ viết một vài điều nữa. 🙂

  2.   Marian dijo

    Các bài viết của bạn thật tuyệt vời, bạn học được rất nhiều điều, đúng hơn, bạn học cách thực hiện các công việc một cách thanh lịch và hiệu quả.

    Bạn đã nghĩ đến việc thu thập tất cả các bài viết script shell của mình chưa? Được sắp xếp dưới dạng pdf sẽ tạo nên một cuốn sổ tay tuyệt vời.

    Vui lên và cảm ơn bạn rất nhiều!

    1.    lục giác dijo

      Cảm ơn rất nhiều!! Đó không phải là một ý kiến ​​tồi. Hiện tại chỉ có hai cái, nhưng tôi sẽ nghĩ về nó sau. 🙂

  3.   kiyov dijo

    bài viết rất tốt, 5+.

    1.    lục giác dijo

      Cảm ơn bạn. Tôi vui vì bạn thích nó. 🙂

  4.   sebastian dijo

    Thông minh! Tôi cần thay đổi biểu thức sau và tôi không biết cách thực hiện:
    192.168.0.138/Server bởi 192.168.0.111/data
    Vấn đề nằm ở ký hiệu "/".
    Tôi đang sử dụng lệnh:
    tìm thấy. -name "* .txt" -exec sed -i 's / TEXT1 / TEXT2 / g' {} \;
    Những gì được sử dụng để thực hiện loại nhiệm vụ này một cách dễ dàng, nhưng tôi không thể ...
    Có ai biết tôi nên làm như thế nào không?
    Ôm!
    Seba

    1.    lục giác dijo

      Những gì bạn phải làm là thoát khỏi nhân vật như thế này:

      tìm thấy. -name "* .txt" -exec sed -i 's / \ / Server / \ / data / g' {} \;

      Bạn cũng có thể sử dụng một dấu phân tách khác trong sed. Nó không cần phải là một quán bar. Sed cho phép bất kỳ ký tự nào được sử dụng. Ví dụ, điều này sẽ rõ ràng hơn:

      tìm thấy. -name "* .txt" -exec sed-s | / Server | / data | g '{} \;

      Và nếu bạn định sao chép và dán các lệnh từ nhận xét này, hãy cẩn thận với dấu ngoặc kép, wordpress sẽ thay đổi chúng cho các lệnh typographic. 🙂

      Chúc mừng.

  5.   sebastian dijo

    Thông minh!!!!
    Tôi đã tìm kiếm giải pháp này trong một thời gian dài.
    Ở đây tôi để lại lệnh hoàn chỉnh mà tôi đã sử dụng

    tìm thấy. -name "* .txt" -exec sed -i 's | 192 \ .168 \ .0 \ .238 \ / Server | 192 \ .168 \ .0 \ .111 \ / data | g' {} \;

    Ưu điểm của lệnh này là nó thay đổi tất cả các tệp .txt (hoặc phần mở rộng bạn muốn) một cách đệ quy ... Bạn phải rất cẩn thận!
    Nhưng nó rất hữu ích !!!

    Vâng, cảm ơn vì tất cả mọi thứ và một nghìn lời chúc mừng đến toàn bộ nhóm.
    Tôi luôn đọc chúng từ thư!
    Ôm
    Seba