इसे फिर से देखना, और एक बैश शेल के अलावा और कुछ भी उपयोग करने की कोशिश करना, एक और एक लाइन समाधान है:
while read url; do url="${url##*/}" && echo "${url%%\'*}"; done < file.in > file.out
जहाँ file.in में 'डर्टी' url लिस्ट है और file.out में 'क्लीन' URL लिस्ट होगी। कोई बाहरी निर्भरता नहीं हैं और किसी भी नई प्रक्रिया या उपधारा को स्पॉन करने की कोई आवश्यकता नहीं है। मूल स्पष्टीकरण और अधिक लचीली स्क्रिप्ट निम्नानुसार है। यहां विधि का एक अच्छा सारांश है , उदाहरण 10-10 देखें। यह बैश में पैटर्न आधारित पैरामीटर प्रतिस्थापन है।
विचार पर विस्तार:
src="define('URL', 'http://url.com');"
src="${src##*/}" # remove the longest string before and including /
echo "${src%%\'*}" # remove the longest string after and including '
परिणाम:
url.com
किसी भी बाहरी कार्यक्रमों को कॉल करने की आवश्यकता नहीं है। इसके अलावा, निम्नलिखित बैश स्क्रिप्ट, get_urls.sh
आपको सीधे या स्टड से फाइल पढ़ने की अनुमति देती है:
#!/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
।