Я пишу сценарий оболочки для разрешения https://t.co
ссылок в твитах (это сокращенные ссылки, которые перенаправляют куда-то еще). Я написал следующую функцию:
#!/bin/bash
function resolvelinks {
local content="$1"
IFS=$'\n' read -r -d '' -a foundlinks < <(grep -o 'https://t.co/[a-zA-Z0-9]*' <<< "$1")
for link in "${foundlinks[@]}" ; do
resultinglink=$(curl -s -D - "$link" | grep location: | sed 's/^location: //g')
content=$(sed "s|${link}|${resultinglink}|" <<< "$content")
done
echo "$content"
}
resolvelinks "$@"
Предположим, у меня есть следующий текст твита в файле с именем tweet.txt
:
Apple is moving WWDC 2020 to online only
https://t.co/ xw72yfhUR2 https://t.co/ ddCAppLrL1
Когда у меня есть одна t.co
ссылка, как показано ниже, функция работает, как и ожидалось:
$ ./resolvelinks.sh "$(cat tweet.txt)"
Apple is moving WWDC 2020 to online only
https://developer.apple.com/wwdc20/
Однако, когда у меня есть две или более ссылки t.co
, она обрезает результат, и я не уверен, почему:
./resolvelinks.sh "$(cat tweet.txt)"
Apple is moving WWDC 2020 to online only
https://twitter.com/MKBHD/status/1238499066323046400/photo/1
Почему это происходит с sed и grep, и как мне это исправить / избежать? (Мне пришлось вставлять пробелы в t.co
ссылках в моих примерах, потому что SO не позволяет мне включать сокращатель URL в мой вопрос)
Для справки, я ожидаю В выходных данных должны быть две разрешенные ссылки:
./resolvelinks.sh "$(cat tweet.txt)"
Apple is moving WWDC 2020 to online only
https://developer.apple.com/wwdc20/ https://twitter.com/MKBHD/status/1238499066323046400/photo/1
По запросу bash trace:
+ resolvelinks 'Apple is moving WWDC 2020 to online only
https://t.co/ xw72yfhUR2 https://t.co/ ddCAppLrL1'
+ local 'content=Apple is moving WWDC 2020 to online only
https://t.co/ xw72yfhUR2 https://t.co/ ddCAppLrL1'
+ IFS='
'
+ read -r -d '' -a foundlinks
++ grep -o 'https://t.co/[a-zA-Z0-9]*'
+ for link in "${foundlinks[@]}"
++ curl -s -D - https://t.co/ xw72yfhUR2
++ grep location:
++ sed 's/^location: //g'
+ resultinglink=$'https://developer.apple.com/wwdc20/\r'
|' sed 's|https://t.co/ xw72yfhUR2|https://developer.apple.com/wwdc20/
+ content='Apple is moving WWDC 2020 to online only
https://t.co/ ddCAppLrL1'om/wwdc20/
+ for link in "${foundlinks[@]}"
++ curl -s -D - https://t.co/ ddCAppLrL1
++ grep location:
++ sed 's/^location: //g'
+ resultinglink=$'https://twitter.com/MKBHD/status/1238499066323046400/photo/1\r'
|' sed 's|https://t.co/ ddCAppLrL1|https://twitter.com/MKBHD/status/1238499066323046400/photo/1
+ content='Apple is moving WWDC 2020 to online only
'https://twitter.com/MKBHD/status/1238499066323046400/photo/1
+ echo -e 'Apple is moving WWDC 2020 to online only
'https://twitter.com/MKBHD/status/1238499066323046400/photo/1
Apple is moving WWDC 2020 to online only
https://twitter.com/MKBHD/status/1238499066323046400/photo/1