我想删除每一行的第10个字符和之后的第一个字符之间的所有字符。
说我的输入看起来像
0123456789 foo. foo....
1234566789 bar. bar...
0912309299 foobar. foobar..
输出类似于
0123456789. foo....
1234566789. bar...
0912309299. foobar..
是否有sed命令执行此操作?
由于
答案 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扩展到sed
或awk
以外的时候,这是一个方便的帖子。正如我上面的答案明显指出的那样,在这种情况下,这些都不是必需的,仅仅是为了兴趣。
答案 2 :(得分:1)
对于您的数据,此awk
会提供正确的输出。
awk '{$2="";sub(/ /,".")}1' file
0123456789. foo....
1234566789. bar...
0912309299. foobar..
只需删除第二个字段,然后将第一个空格更改为.