У меня есть строка вроде: dog cat bird whale
И я хочу получить dog dog cat cat bird bird whale whale
Все слова в одной строке. Любая идея?
Добавление в семейство решений :-).
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
Сделайте исполняемый файл и теперь:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
В качестве альтернативы в качестве функции оболочки, например, для повторного использования в скрипте:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
который затем может быть запущен непосредственно там, где определяется
duplicator dog cat bird whale
Вы можете использовать
sed
:Если вы хотите сохранить изменения в файле на месте, скажите:
Вы также можете использовать
perl
:(Добавьте
-i
опцию, чтобы сохранить изменения в файле на месте.)Или, как предполагает Тердон :
Цитирование из
perlvar
:источник
sed -r 's/\S+/& &/g'
.-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
Что бы это было без
awk/gawk
ответа:Если важен завершающий перевод строки:
источник
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
и короче, и более читабельно, ИМХО.источник
sed -n 'p;p'
- я думал, что это было более прозрачным в том, что он делает.Если у вас есть строка в переменной, скажем
foo="dog cat bird whale"
, вы можете сделать:Чистая Баш:
Объяснение: Скобки нужны для того, чтобы
read
иecho
происходили в одной и той же подоболочке и поэтому могли совместно использовать переменные. Без нихecho
просто напечатать пустую строку.Coreutils:
Объяснение:
-o
флагjoin
позволяет установить формат вывода. Здесь я советую напечатать 1-е поле 1-го файла (1.1
), затем 2-е поле 1-го файла (1.2
) и т. Д. Таким образом, каждое поле 1-го файла печатается дважды. Тем не менее,join
он предназначен для объединения двух строк ввода в общее поле. Итак, я также пропускаю пустую строку (<(echo)
) и затем игнорирую это. В-j
наборах Соединить поле, установив его на тот , который не существует (5 - й) приводитjoin
к печати всей линии.Если вам не нужны пробелы или порядок ввода, вы можете сделать
Perl 1:
Объяснение:
Сценарий выше сохранит каждое поле (из
@F
) дважды в массиве,@k
а затем напечатает@k
. Если вам не нужен завершающий перевод строки, вы можете упростить доPerl 2:
Объяснение:
-0
опция устанавливает входной разделитель записей (как шестнадцатеричное или восьмеричное число, см здесь для преобразования). Здесь я устанавливаю восьмеричное значение,040
которое является пробелом. В-p
маркеperl
печать каждого входа «линия» и с тех пор мы установили разделитель в пространство, линии теперь определяются пробелами, поэтому каждое поле печатаются дважды.awk
:Объяснение:
NF
это число полей, поэтому приведенный выше скрипт просматривает каждое поле и добавляет его к себе. Как только это будет сделано, мы печатаем строку (1;
просто сокращение для печати).источник
Теперь для
python
ответа:Из командной строки:
Из стандартного ввода:
Результат в обоих случаях:
источник
Немного чрезмерно, но
haskell
ответ:источник
Другой подход, также использующий только встроенные команды bash
Я не вижу никаких преимуществ по сравнению с основным ответом, просто чтобы показать немного другой способ, который может быть лучше подходит для некоторых целей.
источник
echo
это также оболочка, встроенная в Bash (тестtype echo
).