bash在一行中打印多行的单词

时间:2017-05-13 19:26:09

标签: bash printf echo

我正在编写一个shell脚本,我写了一个包含30个(增长的)列名的标题。现在,我有一个有效的echo语句

echo "Colum_Name1, Column_Name2,Column_Name30"

虽然这有效但可读性对我来说很糟糕。如果我想添加一个列,那么看一下屏幕并了解它是否已经在那里有点噩梦。当然,我搜索我的出路。是否可以使用echo或printf执行类似的操作并将CSV放在一行中?

echo " Column_Name1,
       Column_Name2,
       Column_Name30"

并输出

Column_Name1,Column_Name2,Column_Name30

4 个答案:

答案 0 :(得分:3)

您可以添加反斜杠作为续行:

echo " Column_Name1,"\
       "Column_Name2,"\
       "Column_Name30"

来自bash manual

  

反斜杠字符'\'可用于删除任何特殊含义   用于下一个字符读取和行继续。

答案 1 :(得分:2)

解除标题的定义并打印它,并使用数组存储列名。

headers=(
  Column_Name1
  Column_Name2
  Column_Name30
)

(IFS=","; printf '%s\n' "${headers[*]}")

当扩展IFS时,数组的元素由${headers[*]}的第一个字符连接。使用子shell,因此您不必担心恢复IFS的先前值。

答案 2 :(得分:0)

便利解决方案,使用paste

如果您不介意调用外部实用程序(paste)来构建字符串(可能忽略不计),您可以将其与(文字,在本例中)here-doc结合使用:

paste -s -d, - <<'EOF'
Column_Name1
Column_Name2
Column_Name30
EOF

产量

Column_Name1,Column_Name2,Column_Name30    

由于开头分隔符'EOF'引用,上述内容就像单引号字符串。
省略封闭的'...'以将字符串视为双引号字符串,即执行扩展(允许包含变量引用,命令替换和算术扩展)。

如果您注意在here-doc中使用实际主要标签\t(多个空格< em> not work),您甚至可以引入缩进-预先添加到开头分隔符

# !! Only works with actual *tabs* as the leading whitespace.
paste -s -d, - <<-'EOF'
    Column_Name1
    Column_Name2
    Column_Name30
EOF

更有效的解决方案,使用续行

与POSIX兼容的shell支持行继续甚至内部双引号字符串,"..." (但不在 - 引用内部那些,'...')。

这意味着双引号字符串中的任何\<newline>序列已删除

echo "\
Column_Name1,\
Column_Name2,\
Column_Name3\
"

鉴于带有未加引号开头分隔符的here-document被视为双引号字符串,您可以执行以下操作:

cat <<EOF
Column_Name1,\
Column_Name2,\
Column_Name30
EOF

注意:

  • 为了便于阅读,将<<-EOF与待剥离的主要标签\t)一起使用这里是一个选项,因为行继续仍然包含它们。

  • 为了利用行继续,它总是必须使用的插值(扩展)here-doc变体;因此,您可能需要\ - 转义$个实例以确保其文字使用。

两个命令再次产生所需的单行字符串:

Column_Name1,Column_Name2,Column_Name30

答案 3 :(得分:-2)

echo "foo bar" |  (IFS=" "; xargs -n 1 echo)

收益

foo
bar