Bash 脚本重复一行中的每个单词?

Cri*_*ian 13 linux script bash string

我有一个像这样的字符串: dog cat bird whale

我想得到 dog dog cat cat bird bird whale whale

所有的词都在同一行。任何的想法?

Dan*_*son 28

添加到解决方案系列:-)。

duplicator.sh

for i; do echo -n "$i $i "; done; echo
Run Code Online (Sandbox Code Playgroud)

使可执行文件,现在:

$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Run Code Online (Sandbox Code Playgroud)

或者作为 shell 函数,例如在脚本中可重用:

duplicator() {
    for i; do echo -n "$i $i "; done; echo
}
Run Code Online (Sandbox Code Playgroud)

然后可以直接在定义为的地方运行

duplicator dog cat bird whale
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢 shell 方法的简单性。 (4认同)

dev*_*ull 21

你可以使用sed

sed -r 's/(\S+)/\1 \1/g' filename
Run Code Online (Sandbox Code Playgroud)

如果要就地保存对文件的更改,请说:

sed -i -r 's/(\S+)/\1 \1/g' filename
Run Code Online (Sandbox Code Playgroud)

您还可以使用perl

perl -M5.10.0 -ne 'say join " ", map{$_, $_} split " ";' filename
Run Code Online (Sandbox Code Playgroud)

(添加-i选项以就地保存对文件的更改。)

或者,正如terdon所建议的那样

perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;' filename
Run Code Online (Sandbox Code Playgroud)

引自perlvar

@F

该数组@F包含打开自动拆分模式时读入的每一行的字段。有关-a开关,请参阅 perlrun 。这个数组是特定于包的,如果在strict 'vars'.

  • 更短:`sed -r 's/\S+/& &/g'`。 (4认同)
  • @PeterMortensen 您在技术上是正确的(最好的正确类型),但实际上每个安装了 bash 的系统也将具有标准的 unix 工具,包括 sed 和 awk。shell 脚本的全部意义(嗯,它的很大一部分)是将命令指向正确的位置。 (4认同)
  • @PeterMortensen 这是不正确的。bash 脚本可以调用外部命令。bash 脚本应该以 shebang 行开头,但这并不是绝对必要的。该问题没有指定 bash 脚本不应调用外部命令(通常称为“纯 bash 脚本”)。 (3认同)
  • 那不是 Bash 脚本。调用某些命令(甚至从 Bash shell)并不构成 Bash 脚本。 (2认同)
  • 漂亮的 perl 技巧。你可以用 `-a` 缩短它: `perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;' ` (2认同)