使用 sed 剪切以 n 个空格开头并以 n 个空格结尾的字符串

使用 sed 剪切以 n 个空格开头并以 n 个空格结尾的字符串

如何使用sed剪切以 x 空格开头并以 y 空格结尾的文本?

例如这是我的字符串:

 kkk 111 fff      aaabbb 5d98 ccc         mmmppp 9369d

我想得到这个输出:

 aaabbb 5d98 ccc

(空格数未知)

谢谢。

答案1

我们讲述了一些带有未知数量空格的文本,所以

sed 's/.* \{2,\}\([[:alnum:]].*\) \{2,\}.*/\1/'

或与 -r (-E) 一起使用

sed -E 's/.* {2,}([[:alnum:]].*) {2,}.*/\1/'

似乎足够了,但grep在这种情况下更好

grep -Po ' {2,}\K[[:alnum:]].*(?= {2,})'

不是那么强(只有两个空格)但也正确:

sed -E 's/.*  (\w.*)  .*/\1/'

答案2

编辑:我从 jimmij 借用了-r标志(启用扩展的正则表达式语法)来治愈反冲炎。

在以下条件下进行以下工作:

  • 你愿意说字段分隔符至少是n空格,例如 3
  • 感兴趣字段的内容不包含任何空格。

在这种情况下,这个正则表达式有效:

    echo ' 01      Title      Chapter 01' |
    sed -r 's/^.* {3,}([^ ]+) {3,}.*$/\1/'

或者,如果您喜欢反斜杠,这就是非扩展正则表达式语法的样子:

    echo ' 01      Title      Chapter 01' |
    sed 's/^.* \{3,\}\([^ ]\+\) \{3,\}.*$/\1/'

正则表达式的解释:

^        start of line
.*       any number of characters at the start of the line
 {3,}    at least 3 spaces
([^ ]+)  1 or more non-space characters (capture this group as \1)
 {3,}    at least 3 spaces
.*       anything on the rest of the line
$        end of the line. Not needed, because of the .*, but nicely explicit.

答案3

假设您希望两侧的空格数量相同:

$ sed -r 's/(^|.*[^[:space:]])([[:space:]]+)([^[:space:]]+)\2([^[:space:]].*|$)/\3/g' <<<"01      Title      Chapter 01"
Title

(我使用了字符类而不只是,只有一个空格,表达式应该要短得多:)sed -r 's/(^|.*[^ ])( +)([^ ]+)\2([^ ].*|$)/\3/g'

通过使用 LHS 中的反向引用,我们确保两侧存在相同数量的空格。

答案4

您可以使用-r扩展正则表达式的选项,其中可以指定内部字符数{},因此以下将打印所有周围有 6 个空格:

sed -r 's/.* {6}(\w*) {6}.*/\1/'

万一如果标题也有空格,更好的选择是

sed -r 's/.* {6}(.*) {6}.*/\1/'

相关内容