我尝试将干净的列式数据转换为tex中的表。我无法在每一行都有“\ n”。请在最后看到命令。
数据
$ . ./bin/addTableTexTags.sh < .data_3
10.31 & 8.50 & 7.40
10.34 & 8.53 & 7.81
8.22 & 8.62 & 7.78
10.16 & 8.53 & 7.44
10.41 & 8.38 & 7.63
10.38 & 8.57 & 8.03
10.13 & 8.66 & 7.41
8.50 & 8.60 & 7.15
10.41 & 8.63 & 7.21
8.53 & 8.53 & 7.12
$ cat .data_3
10.31 8.50 7.40
10.34 8.53 7.81
8.22 8.62 7.78
10.16 8.53 7.44
10.41 8.38 7.63
10.38 8.57 8.03
10.13 8.66 7.41
8.50 8.60 7.15
10.41 8.63 7.21
8.53 8.53 7.12
addTableTexTags.sh
#!/bin/bash
sed -e "s@[[:space:]]@\t\&\t@g" -e "s@[[:space:]]*&*[[:space:]]*\$@\t \\ \\\\n@g"
// Tried Escaping "\\" with "/" here and there
// but cannot get a line ending with "\\ \n".
答案 0 :(得分:2)
如果你想让每一行以一对反斜杠,一个空格,另一个反斜杠和一个'n'(后面跟换行符)结束,那么:
sed 's/$/\\\\ \\n/'
如果那不是您想要的,请解释您的需求。
单引号阻止shell乱用反斜杠。使用双引号,即:
sed "s/\$/\\\\\\\\ \\\\n/"
是 - 连续8个反弹!好玩,不是吗?
将此修改为您引用的脚本很难。第一个术语使用“\t
”,但不清楚这是一个制表符还是一个实际的反斜杠和字母't'。
sed -e 's@[[:space:]]@\t\&\t@g' \
-e 's@[[:space:]]*&[[:space:]]*$@\\\\ \\n@g'
如果你需要输出中的实际标签,我通常会将它们键入标签(确保我当时没有'vim'设置为expandtabs)。如果我必须扩展'\t
',那么我通常使用Perl,因为我知道它的规则,不同的shell对规则有不同的看法。请注意,我在“&amp;”之后立即删除了'*'在最后一场比赛中;我想你想要'&amp;'由先前的规则删除添加。
答案 1 :(得分:2)
这是一种没有太多正则表达式的简单方法。只需设置输出字段分隔符(OFS)。
$ awk '{$1=$1}1' OFS=" & " file
10.31 & 8.50 & 7.40
10.34 & 8.53 & 7.81
8.22 & 8.62 & 7.78
10.16 & 8.53 & 7.44
10.41 & 8.38 & 7.63
10.38 & 8.57 & 8.03
10.13 & 8.66 & 7.41
8.50 & 8.60 & 7.15
10.41 & 8.63 & 7.21
8.53 & 8.53 & 7.12
相当于:awk '{$1=$1}1' OFS=" & " .data | sed -e 's@$@\\\\@g'
你拥有的是。
awk '{$1=$1;$0=$0"\\\\"}1' OFS=" & " file
当你使用awk时,不需要使用sed。