2016-01-24 37 views
0

我遇到以下问题。我有一系列数字:如何在bash中删除字符串中的前导换行符?

text="\n1\t2\t3\t4\t5\n6\t7\t8\t9\t0" 

而且我想删除前导换行符。 我试过

sed 's/.//' <<< "$text" 
cut -c 1- <<< "$text" 

和一些反复。但问题是,这两个都删除每一个换行符后面的第一个字符。导致在这:

text="\n\t2\t3\t4\t5\n\t7\t8\t9\t0" 

这不是我想要的,似乎没有这种情况下的答案。

有没有办法告诉这些命令中的任何一种将字符和整个字符串这样的换行符视为一个实体?

回答

1

awk来救援!

awk 'NR>1' 

当然也可以做同样的tail -n +2sed 1d为好。

+0

我怀疑我完全没有把这个问题置于其中,但现在看起来这里只需要一个简单的'var =“$ {var#$'\ n'}”''。 –

0

你或许可以使用替换修改(见parameter expansionANSI C quoting在Bash的手册):

$ text=$'\n1\t2\t3\t4\t5\n6\t7\t8\t9\t0' 
$ echo "$text" 

1 2 3 4 5 
6 7 8 9 0 
$ echo "${text/$'\n'/}" 
1 2 3 4 5 
6 7 8 9 0 
$ 

它取代了第一个换行符什么也没有,按要求。但是请注意,它不是固定在第一个字符:

$ alt="${text/$'\n'/}" 
$ echo "${alt/$'\n'/}" 
1 2 3 4 56 7 8 9 0 
$ 

使用插入符号^换行符之前不会帮助 - 它只是意味着没有匹配。

正如comments指出的rici,如果你阅读手册页我引用,你可以找到如何与#前缀停泊在启动模式:

$ echo "${text/#$'\n'/}" 
1 2 3 4 5 
6 7 8 9 0 
$ echo "${alt/#$'\n'/}" 
1 2 3 4 5 
6 7 8 9 0 
$ 

记号不承担任何明显与其他正则表达式系统相似;你只需要知道它。

+1

要固定模式,请使用'#'。我知道,我知道,bash很奇怪。引用man bash:“如果'pattern'以'#'开始,它必须匹配'parameter'的扩展值的开始,如果'pattern'以'%'开始,它必须匹配扩展值的末尾'参数' – rici

+0

与所有其他正则表达式系统之间存在如此密切的关系。是的,我再也不读这个了。 –

相关问题