Answers:
添加到解决方案系列中:-)。
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
:
sed -r 's/(\S+)/\1 \1/g' filename
如果要就地保存对文件的更改,请说:
sed -i -r 's/(\S+)/\1 \1/g' filename
您还可以使用perl
:
perl -M5.10.0 -ne 'say join " ", map{$_, $_} split " ";' filename
(添加-i
选项以将更改保存到原位。)
或者,按照terdon的建议:
perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;' filename
引用自perlvar
:
@F
该数组
@F
包含打开自动拆分模式时读入的每一行的字段。参见perlrun进行-a
切换。此数组是特定于程序包的,如果在下运行,则必须在包主目录中声明该数组或为其指定完整的包名strict 'vars'
。
sed -r 's/\S+/& &/g'
。
-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
没有awk/gawk
答案,这将是什么:
$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }}' <<<"dog cat bird whale"
dog dog cat cat bird bird whale whale
如果终止换行很重要:
$ awk '{ for(i=1;i<=NF+1;i+=1/2) { printf("%s ",$i); }} END{print ""}' <<<"dog cat bird whale"
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
恕我直言,这不是我的不赞成,但更简短,也更具可读性。
s="dog cat bird wale"
ss=$( tr ' ' '\n' <<< "$s" | sed p | tr '\n' ' ' )
echo "$ss"
dog dog cat cat bird bird wale wale
sed -n 'p;p'
-我认为这样做的透明度更高。
如果您将字符串包含在变量中,请说foo="dog cat bird whale"
,您可以这样做:
纯重击:
$ echo "$foo" | (read a b c d && echo "$a $a $b $b $c $c $d $d")
dog dog cat cat bird bird whale whale
说明:需要括号,以便read
and echo
出现在同一子外壳中,因此可以共享变量。没有它们,它们echo
只会打印空白行。
coreutils:
$ join -j 5 -o 1.1,1.1,1.2,1.2,1.3,1.3,1.4,1.4 <(echo $foo) <(echo)
dog dog cat cat bird bird whale whale
说明:的-o
标志join
允许您设置输出格式。在这里,我告诉它打印第一个文件的第一个字段(1.1
),然后打印第一个文件的第二个字段(),依此类推1.2
。这样,第一个文件的每个字段将打印两次。但是,join
它的设计目的是将两个输入线连接到一个公共字段上。因此,我还将空白行(<(echo)
)传递给它,然后忽略它。该-j
套连接字段,将其设置为一个不存在的(5日)会导致join
打印整行。
如果您不关心空格或输入顺序,可以这样做
$ paste <(echo $foo) <(echo $foo)
dog cat bird wale dog cat bird wale
Perl 1:
$ echo $foo | perl -lane 'push @k, $_,$_ for @F; print "@k"'
dog dog cat cat bird bird whale whale
说明:
-l: adds a newline to each print call (among other things)
-a: turns on field splitting, fields are saved as @F
-n: process input line by line
-e: give a script as a command line parameter.
上面的脚本会将每个字段(从中@F
)保存到数组中两次@k
,然后进行打印@k
。如果您不需要结尾的换行符,则可以简化为
$ echo $foo | perl -ane 'print " $_ $_" for @F'
Perl 2:
$ echo $foo | perl -0040 -pne 'print "$_"' | paste - -
dog dog cat cat bird bird whale whale
说明:该-0
选项设置输入记录分隔符(十六进制或八进制数字,有关转换,请参见此处)。在这里,我将其设置为八进制040
,即一个空格。该-p
品牌perl
打印每个输入“线”和因为我们已经设置的记录分隔空间,线现在由空间定义,所以每一个场被印刷两次。
awk
:
$ echo $foo | awk '{for(i=1;i<=NF;i++){$i=$i" "$i;} 1;}'
dog dog cat cat bird bird whale whale
说明: NF
是字段数,因此上面的脚本会遍历每个字段并将其附加到自身。完成后,我们打印行(1;
这只是简写)。
现在寻求python
答案:
在命令行中:
$ python -c "import sys; s=sys.argv[1:]; print(' '.join(j for i in zip(s,s)for j in i));" dog cat bird whale
从标准输入:
$ python -c "s=input().split(); print(' '.join(j for i in zip(s,s)for j in i));" <<<"dog cat bird whale"
两种情况下的结果:
dog dog cat cat bird bird whale whale
另一种方法,也仅使用bash内置函数
$ string="dog cat bird whale"
$ twix() { while [[ ! -z $1 ]]; do printf "%s %s " $1 $1; shift; done; }
$ twix $string
dog dog cat cat bird bird whale whale
与最高答案相比,我看不出任何好处,只是显示出一种略有不同的方式,这可能更适合某些目的。
echo
也是Bash(测试type echo
)内置的shell 。