Почему sed иногда обрезается при замене? - PullRequest
0 голосов
/ 14 марта 2020

Я пишу сценарий оболочки для разрешения 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

1 Ответ

3 голосов
/ 14 марта 2020

Ответ curl имеет \r\n в конце каждой строки, а символ \r остается в $resultinglink. Вы можете удалить его с помощью команды sed.

resultinglink=$(curl -s -D - "$link" | grep location: | sed -e 's/^location: //' -e $'s/\\\r//')
...