Bagaimana cara melarikan diri <atau> dalam parameter di shell?

10

Saya ingin menggunakan grepdengan ekspresi PCRE yang berisi <karakter. Bash berpikir aku ingin mengalihkan, tetapi aku tidak mau. Bagaimana saya bisa melarikan diri <?

hakre
sumber

Jawaban:

11

Saya bisa melakukannya dengan backslash:

25 % grep \< xmospos.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <getopt.h>
#include        <X11/Xlib.h>

Yang dikutip kurang dari, dan yang dikutip, backslashed kurang dari keduanya memberikan jawaban konyol.

Bruce Ediger
sumber
5
Ya, atau tuliskan dalam tanda kutip tunggal
glenn jackman
Saya masih perlu belajar, misalnya bagaimana cara kerjanya dengan melarikan diri: grep -oP '(?< )(.*)$'tidak bekerja dengan tanda kutip tunggal misalnya. Awalnya sudah dicoba.
hakre
@ hakre Sepertinya ada kesalahan sintaksis di regexp Anda. Apakah maksud Anda (?<! )(.*)$atau (?<= )(.*)$?
Gilles 'SANGAT berhenti menjadi jahat'
4

Dua aturan sederhana:

  • Garis miring terbalik \Cdari karakter berikutnya, apa pun itu, selain baris baru.
  • Kutipan tunggal 'text'lolos dari setiap karakter di antara mereka, termasuk garis miring terbalik, tetapi tidak termasuk kutipan tunggal (karena menandai akhir dari teks yang dikutip).

Jadi:

grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile

Jika Anda perlu memberikan argumen yang berisi tanda kutip tunggal, Anda dapat menggunakan '\''untuk "melarikan diri" satu kutipan di dalam tanda kutip tunggal. Secara teknis, yang dilakukan adalah mengakhiri teks literal pertama, lalu meletakkan literal 'pada kata yang sama, kemudian lebih banyak teks literal masih dalam kata yang sama.

grep '^D'\''oh!' myfile

Sisa aturan penawaran (diringkas):

  • Anda perlu mengutip karakter berikut setidaknya beberapa kali: spasi putih dan !"#$&'()*;<>?[\]^`{|}~(dengan kata lain, karakter berikut aman: huruf, angka, %+,-./:=@_dan karakter non-ASCII).
  • Di antara tanda kutip ganda, semua karakter digunakan secara harfiah kecuali "$\`dan (dalam cangkang dengan riwayat diaktifkan) !. Garis miring terbalik antara tanda kutip ganda akan muncul dalam string kecuali itu mendahului salah satu karakter non-literal.

Aturan-aturan ini untuk bash dan kerang gaya Bourne lainnya (seperti abu dan ksh). Mereka juga berlaku untuk zsh (kecuali bahwa =setelah spasi mungkin perlu mengutip). Aturan dalam csh / tcsh dan di Fish berbeda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber