Apa cara termudah untuk menghapus garis miring dari setiap parameter?


98

Apa cara paling sederhana untuk menghapus garis miring dari setiap parameter dalam larik '$ @', sehingga rsyncmenyalin direktori berdasarkan nama?

rsync -a --exclude='*~' "$@" "$dir"

Judul telah diubah untuk klarifikasi. Untuk memahami komentar dan jawaban tentang beberapa garis miring, lihat riwayat edit.


Jawaban:


160

Anda dapat menggunakan ${parameter%word}perluasan yang dijelaskan di sini . Berikut ini skrip pengujian sederhana yang mendemonstrasikan perilaku tersebut:

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}

35
+1: Untuk menjadi sangat bertele-tele, itu akan menghapus satu garis miring, tidak semua garis miring. Untuk menghapus sejumlah garis miring:shopt -s extglob; echo "${@%%+(/)}"
— glenn jackman

24
Peringatan: Anda mungkin tidak ingin menghapus garis miring di semua kasus. Jika "/" diberikan sebagai argumen, menghapus garis miring akan memiliki ... konsekuensi yang tidak menguntungkan.
— Gordon Davisson

13
PROTIP: Gabungkan tr -s /dengan variabel regex untuk menghapus garis miring berulang kemudian menghapus garis miring. misalnyaDIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
— Dave

1
Betulkah? Pada prompt pesta, lari set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"dan beri tahu saya apa yang Anda lihat
— glenn jackman

1
@twalberg Saya menghargai "protips" yang bukan hanya jawaban alternatif untuk pertanyaan OP di utas komentar.
— Kyle Strand

39

Jawaban yang diterima akan memangkas SATU garis miring.

Salah satu cara untuk memangkas beberapa garis miring adalah seperti ini:

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

Output mana:

/looks/like/a/path/// /looks/like/a/path

1
Jangan lupa untuk mengutip variabel Anda, jika variabel tersebut berisi spasi: TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
— tetsujin

1
Sebenarnya itu tidak perlu di dalam $()konstruksi. Namun itu juga tidak berbahaya :) jadi mungkin praktik yang baik untuk menggunakan tanda kutip ganda seperti "$VALUE"sehingga Anda tidak perlu memutuskan kapan dan kapan tidak menggunakan tanda kutip ganda.
— Chris Johnson

Adakah cara untuk menggabungkan ini dengan jepretan sebelumnya? Saya ingin menghapus protokol dan (jika ada) garis miring dari URL tetapi echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'tidak berfungsi (karena grup penangkapan cocok dengan garis miring juga saya kira). Saya bisa melakukannya dengan dua perintah: echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'tetapi bertanya-tanya apakah itu bisa dilakukan dengan satu perintah ?
— Adam

Jawaban ini bekerja lebih baik untuk saya dengan file input yang sangat besar. Orang sederhana sed 's:/*$::' < in.txt > out.txtmelakukan pekerjaan dalam hitungan detik
— MitchellK

22

Ini bekerja untuk saya: ${VAR%%+(/)}

Seperti dijelaskan di sini http://wiki.bash-hackers.org/syntax/pattern

Mungkin perlu menyetel opsi shell extglob. Saya tidak dapat melihatnya diaktifkan untuk saya tetapi masih berfungsi


2
Untuk menanyakan pengaturan: shopt extglobtanpa opsi
— glenn jackman

Ini adalah Extended Pattern Language dan Anda harus mengaturnya extglob.
— ingyhere

1
Ini tidak berfungsi pada bash bawaan Mac OS X. Solusi dari Sean Bright di atas adalah:${VAR%/}
— Alec Jacobson

13

realpathmenyelesaikan jalur yang diberikan. Antara lain itu juga menghilangkan garis miring yang tertinggal. Gunakan -suntuk mencegah simlinks berikut

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a

1
Ini membutuhkan semua node di jalur kecuali yang terakhir ada. Jika pengguna melempar di beberapa jalur non-keberadaan, realpathakan gagal.
— Livy

2
@Livy realpath --canonicalize-missingbekerja benar-benar benar dengan bagian jalur yang tidak ada
— maoizm

dan realpath hilang di beberapa platform :-(
— Mark Ribau

8

FYI, saya menambahkan dua fungsi ini ke saya .bash_profileberdasarkan jawaban yang ditemukan di SO. Seperti yang dikatakan Chris Johnson, semua jawaban menggunakan ${x%/}hanya menghapus satu garis miring, fungsi-fungsi ini akan melakukan apa yang mereka katakan, semoga ini berguna.

rem_trailing_slash() {
    echo "$1" | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo "$(rem_trailing_slash "$1")/"
}

4

Dalam zsh Anda dapat menggunakan :apengubah.

export DIRECTORY='/some//path/name//'

echo "${DIRECTORY:a}"

=> /some/path/name

Ini bertindak seperti realpathtetapi tidak gagal dengan file / direktori yang hilang sebagai argumen.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.