Конкатенация строк хранится в переменных рядом

У меня есть две переменные, которые содержат набор строк. Мне нужно объединить результаты этих переменных, чтобы они появлялись рядом.

Переменная a имеет:

t
t
t

Переменная b имеет:

xyz
pqr
stu

Мне нужно получить вывод как

txyz
tpqr
tstu 
4
задан 3 July 2016 в 13:04

4 ответа

Используя paste с заменой процесса:

paste -d '' <(echo "$a") <(echo "$b")
  • <() шаблон замены процесса, вывод команды внутри будет заменен дескриптором файла, это необходимо, поскольку paste берет файлы в качестве входа

  • d '' наборы разделитель как пустой указатель, по мере необходимости

Пример:

$ echo "$a"
t
t
t

$ echo "$b"
xyz
pqr
stu

$ paste -d '' <(echo "$a") <(echo "$b")
txyz
tpqr
tstu
0
ответ дан 3 July 2016 в 13:04
  • 1
    Может тестирование Devuan или нестабильный достаточно хороший для Настольного дистрибутива? Я надеюсь использовать с OpenRC init. – Confguy2016 19 May 2018 в 02:43

На ударе можно сделать это с заменой процесса и paste:

$ a='t                                 
t
t'
$ b='xyz                               
pqr
stu'
$ paste <(echo "$a") <(echo "$b") -d ''
txyz
tpqr
tstu

, Если бы все Вы хотите, t снабжены префиксом к строкам b, awk или sed сделал бы:

$ printf "%s" "$b" | awk '{printf "t"}1'
txyz
tpqr
tstu
0
ответ дан 3 July 2016 в 13:04
  • 1
    Согласитесь с @guntbert, и необходимо объяснить в ответе, что нет никакой причины выполниться /etc/profile с командой /etc/profile. По-видимому, OP хотела считать файл, но если они хотели к , выполняют файл в текущей оболочке (который разумен, поскольку это - конфигурационный файл для оболочек), который был бы сделан с эти source команда, и полномочия не будут проблемой - Вас разрешают source файлы, которые можно считать, и это выполняет их в текущей оболочке. source поэтому довольно опасная команда - удостоверяются, что Вы знаете то, что находится в файле перед определением источника его! – Zanna 25 January 2018 в 11:00

Я не уверен, как это выдерживает сравнение для эффективности, но возможное чистое решение для удара могло бы быть

while IFS= read -r -u3 x; IFS= read -r -u4 y; do 
  printf '%s%s\n' "$x" "$y"; 
done 3<<<"$a" 4<<<"$b"
0
ответ дан 3 July 2016 в 13:04
  • 1
    Я can' t говорят. Я думаю так, но я переместился к Arch (Artix) – Nadir 19 May 2018 в 20:13

Если все, что Вы действительно хотите, является 3 словами, запускающимися с t , можно сделать это:

$ echo $VAR_2 | awk '{print "t"$0}'                                             
txyz
tpqr
tstu

Или это:

$ echo $VAR_2 | sed 's/^/t/g'                                                   
txyz
tpqr
tstu

Если у Вас есть несколько (и отличающийся) слова в переменных, они не предоставляют себя приятно для одновременной обработки, таким образом, я предложил бы использовать array вместо переменных.

$ array1=( 't' 't' 't'  )                                                       


$ array2=('xyz' 'pqr' 'stu' )


$ for i in $(seq 0 2) ; do echo "${array1[$i]}""${array2[$i]}" ; done
txyz
tpqr
tstu
2
ответ дан 3 July 2016 в 13:04
  • 1
    Попробованный ASCII Devuan и разочарован, не полируемый достаточно для среднего пользователя. Это напоминает мне о 2004' s Debian!. Я установил из сетевой ISO с uefi. Потраченный впустую! Теперь с помощью Ubuntu 18.04, печально никакой побег systemd! пока что-то лучше не выходит. – Confguy2016 21 May 2018 в 07:49

Другие вопросы по тегам:

Похожие вопросы: