如何在bash中删除字符串中的前导换行符?

时间:2016-01-24 02:54:09

标签: 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"

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

有没有办法告诉其中任何一个命令将字符和整个字符串等换行视为一个实体?

2 个答案:

答案 0 :(得分:1)

$ docker info Containers: 0 Images: 12 Server Version: 1.9.1 Storage Driver: aufs Root Dir: /mnt/sda1/var/lib/docker/aufs Backing Filesystem: tmpfs Dirs: 12 Dirperm1 Supported: true Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 4.1.13-boot2docker Operating System: Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015 CPUs: 1 Total Memory: 996.2 MiB Name: tensorflow Debug mode (server): true File Descriptors: 11 Goroutines: 19 System Time: 2016-01-24T02:54:29.677797424Z EventsListeners: 0 Init SHA1: Init Path: /usr/local/bin/docker Docker Root Dir: /mnt/sda1/var/lib/docker Labels: provider=virtualbox 救援!

awk

当然,您也可以使用awk 'NR>1' tail -n +2执行相同操作。

答案 1 :(得分:0)

您可以使用替换修饰符(请参阅Bash手册中的parameter expansionANSI C quoting):

$ 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
$

在换行符之前使用插入符^无效 - 这只是意味着没有匹配。

正如rici中的comments所指出的,如果您阅读我引用的手册页,您可以找到如何使用#前缀在开头锚定模式:< / p>

$ 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
$

符号与其他正则表达式系统没有明显的相似之处;你只需知道它。