使用Sed删除第10个字符和第10个字符之后的第一个句点之间的字符

时间:2014-05-12 21:53:59

标签: regex bash sed

我想删除每一行的第10个字符和之后的第一个字符之间的所有字符。

说我的输入看起来像

0123456789 foo. foo....
1234566789 bar. bar...
0912309299 foobar. foobar..

输出类似于

0123456789. foo....
1234566789. bar...
0912309299. foobar..

是否有sed命令执行此操作?

由于

3 个答案:

答案 0 :(得分:7)

这是实现目标的一种方式:

$ sed -r 's/^([0-9]{10})[^.]*/\1/' file
0123456789. foo....
1234566789. bar...
0912309299. foobar..

或者(一般情况下,获得10个第一个字符,无论它们是否为数字):

sed -r 's/^(.{10})[^.]*/\1/'

解释

  • -r允许扩展正则表达式。
  • sed 's/find/replace/'是基本替代:将find替换为replace一次。在这种情况下,我们使用以下内容:
  • ^([0-9]{10})[^.]*抓住前10位数字。此外,将所有字符捕获到点.
  • \1打印第一个区块。

这是替换的模式:

0123456789 foo. foo....
1234566789 bar. bar...
0912309299 foobar. foobar..
^^^^^^^^^^       ^^^^^^^^^^
     |    ^^^^^^^     |
     |         |      |
^([0-9]{10})  [^.]*   |
      |               |
      |          |----
^^^^^^^^^^-------------
0123456789. foo....
1234566789. bar...
0912309299. foobar..

答案 1 :(得分:1)

我认为这应该有用。

sed -P 's/(?<=^.{10}).*?\.//'

编辑:这显然是错误的,正如肯特在下面所指出的那样,我错误地认为sed支持-P for perl兼容的正则表达式,这让我陷入了困境如何在sed中获得perl兼容的正则表达式,肯特提供的一个解决方案是ssed,但我并不想这样做。长话短说,这是perl脚本:

perl -pe 's/(?<=^.{10}).*?(?=\.)//' example.txt
0123456789. foo....
1234566789. bar...
0912309299. foobar..

the post that sullied my hithertoo clean mind with perl knowledge。我从来没有检查过perl,但是当你想要将你的bash-fu扩展到sedawk以外的时候,这是一个方便的帖子。正如我上面的答案明显指出的那样,在这种情况下,这些都不是必需的,仅仅是为了兴趣。

答案 2 :(得分:1)

对于您的数据,此awk会提供正确的输出。

awk '{$2="";sub(/ /,".")}1' file
0123456789. foo....
1234566789. bar...
0912309299. foobar..

只需删除第二个字段,然后将第一个空格更改为.