Bash - Thao tác chuỗi liên tục


11
#!/bin/bash

FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"

Có cách nào để dán hai đường này lại với nhau thành một lớp lót không?

Câu trả lời:


12

FILE=$(basename "${1/%.jpeg/.jpg}") đã làm cho tôi.

kiểm tra:

bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg

nội dung kịch bản:

bash-$ cat test.sh 
#!/usr/bin/bash

FILE=$(basename "${1/%.jpeg/.jpg}")

echo "$FILE"

Vì hai dòng này có thể hoán đổi cho nhau, giải pháp này cho đến nay là gọn gàng nhất ... Nếu các dòng không thể hoán đổi cho nhau sedchắc chắn sẽ rất cần thiết, tôi đoán vậy.
gsklee

11

Bạn không thể mở rộng tổ trong bash (cũng không phải trong ksh, tro và các vỏ khác ngoài zsh). Đây chỉ là một giới hạn mỹ phẩm, vì như bạn minh họa, bạn có thể gán một biểu thức trung gian cho một biến tạm thời. Nó hơi khó chịu đối với một lớp lót, nhưng trong các kịch bản, nó tốt hơn nhiều cho khả năng đọc.

Bạn có thể tránh sử dụng tiện ích bên ngoài basenamevà sử dụng cấu trúc thao tác chuỗi thay thế:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"

Ở đây, điều xảy ra là bạn có thể viết lại tập lệnh của mình để đặt lệnh thay thế ở bên ngoài . Đó không phải là một hiện tượng chung, bạn cũng không đạt được gì ngoài cảm giác một lớp lót nhất định.

Zsh, tốt hơn hay tồi tệ hơn, không cho phép bạn mở rộng lồng nhau:

FILE=${$(basename $1)/%.jpeg/.jpg}    # using basename
FILE=${${1##*/}/%.jpeg/.jpg}          # using string rewriting

Hoặc bạn có thể sử dụng cấu trúc dựng sẵn của zsh thay vì basename:

FILE=${${1:t}/%.jpeg/.jpg}

4

Tôi muốn đi:

FILE=$(basename $1 .jpeg).jpg

Tham số thứ hai cho tên cơ sở là hậu tố được xóa khỏi tên tệp (xem man basename)


3

Bạn có thể sử dụng một sedlệnh như sau:

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")

2

Kết hợp sed, điều này nên thực hiện các mẹo:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(Điều này không trả lời chính xác câu hỏi của bạn vì tôi không thể; không chắc là có thể không.)


1

Các ${}cấu trúc Bash hoạt động với các tên biến , vì vậy không có cách nào để nhúng một lệnh trực tiếp. Cách tiếp cận của @ sr_ là một cách thay thế nếu bạn không quan tâm đến ngã ba thêm.


1

Dòng

FILE=$(basename "${1/%.jpeg/.jpg}")

có thể rút ngắn và làm cho di động hơn với

FILE=$(basename "${1%.jpeg}.jpg")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.