1
while read pos; do 
     string1=`echo $pos | cut -c 20-38`
     string2="=$pos" 
     string3="$string1 $string2" 
     echo "$string3" 
done < file

Это код моего скрипта. Я хочу отобразить вывод в одной строке, но вывод происходит в разных строках. Как я могу это сделать?

ex-pos = abcdefghi1234567890QWERTYUXY.tar.gz string1 = 1234567890QWERTYUXY string2 = abcdefghi1234567890QWERTYUXY.tar.gz

выходной хотел:

1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz

3 ответа3

3

Во-первых, в вашем скрипте несколько опечаток. Кроме того, вы можете использовать

echo -n "$string3 "

напечатать переменную string3 , без добавления перевода строки после этого.

От man echo:

   -n     do not output the trailing newline
1

Вы хотите использовать tr -d '\n' в конце назначения $string1 чтобы удалить разрыв строки, который присутствует в вашем файле:

while read pos; do 
     string1=`echo $pos | cut -c 20-38 | tr -d '\n'`
     string2="=$pos" 
     string3="$string1 $string2" 
     echo "$string3" 
done < file

обратите внимание, что, однако, это даст результат:

QWERTYUXY.tar.gz =abcdefghi1234567890QWERTYUXY.tar.gz

с pos = abcdefghi1234567890QWERTYUXY.tar.gz и сценарием, который вы дали.

0

Вариантов много, но я бы порекомендовал printf .

По умолчанию он не печатает новую строку, поэтому изменение вашего echo на printf должно удалить нежелательный перевод новой строки.

while read pos; do 
    string1=`printf "%s" $pos | cut -c 20-38`
    string2="=$pos" 
    string3="$string1 $string2" 
    printf "%s\n" "$string3" 
done < file

Или, может быть, просто

while read pos; do 
    string1=`printf "%s" $pos | cut -c 20-38`
    string2="=$pos" 
    printf "%s=%s\n" "$string1" "$string2"
done < file

Выход

1234567890QWERTYUXY=abcdefghi1234567890QWERTYUXY.tar.gz

Тем не менее, ваш оригинальный сценарий работает для меня тоже. :-/

Выход

1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .