正则表达式:用'...'替换15号后的所有字符

Jas*_*zek 2 regex

我试图用linux中的'sed'做一些简单的格式化东西,我需要使用正则表达式在第15个字符后修剪一个字符串,并在末尾附加一个'...'.像这样的东西:

before: this is a long string that needs to be shortened
after: this is a long ...
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我如何将其作为正则表达式编写,并且如果可能的话解释它是如何工作的,这样我可以更好地学习正则表达式?

Kon*_*lph 17

以下适用于我:

echo "This is a test with more than 15 characters" | sed "s/\(.\{15\}\).\+$/\1…/"
Run Code Online (Sandbox Code Playgroud)

这里发生的是我们匹配任何字符(.)15次({15}).我们捕获括号内匹配的文本.以下部分(.+$)匹配所有其余部分,直到行尾.我们用在括号(\1)中捕获的任何内容替换它,然后是双曲线省略号.

为了满足sed正则表达式方言(BRE),我们必须逃避一些角色.

  • 应该使用.+而不是.*,以便它不匹配正好15个字符的字符串. (2认同)

The*_*aul 6

Konrand Rudolph回答的解释,因为你要求解释(啊,正如我写的那样,Konrad也加了他自己的解释!)

 sed "s/\(.\{15\}\).+$/\1…/"

\( 
Run Code Online (Sandbox Code Playgroud)

启动一个组 - 请求regexp引擎记住parens中的内容,并将第一个这样的组分配给\ 1,将第二个分配给\ 2等.我们只需要\ 1这里

.
Run Code Online (Sandbox Code Playgroud)

匹配任何东西

\{15\}
Run Code Online (Sandbox Code Playgroud)

...... 15次.

\)
Run Code Online (Sandbox Code Playgroud)

结束小组.所以\ 1将包含前15个字符

 .+
Run Code Online (Sandbox Code Playgroud)

再次匹配任何东西 +表示"一次或多次",因此将匹配超出我们上面匹配的15个字符的字符,...

 $
Run Code Online (Sandbox Code Playgroud)

......直到最后一行

现在替换位:

\1
Run Code Online (Sandbox Code Playgroud)

替换为\ 1的内容

...
Run Code Online (Sandbox Code Playgroud)

和三个点.

完成!