如何使用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/'