Xem lại điều này một lần nữa và cố gắng không sử dụng gì ngoài shell Bash, một giải pháp một dòng khác là:
while read url; do url="${url##*/}" && echo "${url%%\'*}"; done < file.in > file.out
Trong đó file.in chứa danh sách url 'bẩn' và file.out sẽ chứa danh sách URL 'sạch'. Không có sự phụ thuộc bên ngoài và không cần phải sinh ra bất kỳ quy trình hoặc lớp con mới nào. Các giải thích ban đầu và một kịch bản linh hoạt hơn sau. Có một bản tóm tắt tốt về phương pháp ở đây , xem ví dụ 10-10. Đây là sự thay thế tham số dựa trên mẫu trong Bash.
Mở rộng về ý tưởng:
src="define('URL', 'http://url.com');"
src="${src##*/}" # remove the longest string before and including /
echo "${src%%\'*}" # remove the longest string after and including '
Kết quả:
url.com
Không cần phải gọi bất kỳ chương trình bên ngoài. Hơn nữa, tập lệnh bash sau đây get_urls.sh
, cho phép bạn đọc tệp trực tiếp hoặc từ stdin:
#!/usr/bin/env bash
# usage:
# ./get_urls.sh 'file.in'
# grep 'URL' 'file.in' | ./get_urls.sh
# assumptions:
# there is not more than one url per line of text.
# the url of interest is a simple one.
# begin get_urls.sh
# get_url 'string'
function get_url(){
local src="$1"
src="${src##*/}" # remove the longest string before and including /
echo "${src%%\'*}" # remove the longest string after and including '
}
# read each line.
while read line
do
echo "$(get_url "$line")"
done < "${1:-/proc/${$}/fd/0}"
# end get_urls.sh
cat file.php | grep 'URL' | cut -d "'" -f 4
.