Pertanyaan cocok dengan semua string yang hanya berisi satu '/' karakter


Saya memiliki file yang sangat panjang yang berisi jalur file, satu di setiap baris. Saya ingin mengambil daftar semua direktori yang terdaftar yang hanya 1 level. Dengan demikian, saya hanya ingin mengekstrak garis-garis yang memiliki satu / di dalamnya:

Saya ingin: ./somedir
Saya tidak mau: ./somedir/someotherdir

Bisakah saya melakukan ini dengan grep dan / atau ekspresi reguler?


2
2018-05-10 15:55


asal




Jawaban:


Yakin. Itu sangat mudah:

find . | grep -P '^\./[^/]*$'

... dimana jelas perintah 'temukan' yang saya gunakan hanya untuk menggambarkan apa yang Anda gambarkan. Regex berfungsi sebagai berikut:

  • ^ dan $ adalah jangkar yang menentukan (masing-masing) awal & akhir baris. Semua konten harus berada di antara dua karakter tersebut
  • \./ adalah periode literal diikuti oleh garis miring literal
  • [^] adalah kelas karakter yang tidak mengizinkan apa pun setelah ^ dan sebelum ]
  • Itu * setelah [^/] mengatakan untuk memungkinkan nol atau lebih banyak kejadian dari kelas karakter itu

Anda juga bisa melakukannya seperti ini:

dosomething | grep -P '^[^/]*/[^/]*$'

Ini hanya akan memungkinkan satu / di telepon, dalam posisi apa pun di baris (bahkan karakter pertama atau terakhir).


5
2018-05-10 16:09



Sebagai samping, contoh yang Anda berikan dengan ./ membuat saya percaya Anda menghasilkan daftar dengan find. Dengan asumsi itu yang terjadi, Anda dapat melakukan sesuatu seperti ini: find . -maxdepth 1 (other conditions). - Brian Vandenberg


Solusi @Brians berfungsi, ini lebih generik yang tidak membutuhkan ./ pada awalnya:

grep -P '^[^/]*/[^/]*$'

Sebagai contoh:

/aa/somedir
test/somedir/someotherdir
somedir/otherdir

--> somedir/otherdir

1