我正在编写一个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
答案 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