use*_*546 6 linux command-line ubuntu text-processing regular-expression
我在文件中有这样的路径名列表:
/path/to/directory/one.txt
/longer/path/to/some/directory/two.py
/path/with spaces/in/it/three.sh
Run Code Online (Sandbox Code Playgroud)
我想删除最后一次出现“/”后的所有字符,因此上述所需的输出是:
/path/to/directory/
/longer/path/to/some/directory/
/path/with spaces/in/it/
Run Code Online (Sandbox Code Playgroud)
sed 's![^/]*$!!'
Run Code Online (Sandbox Code Playgroud)
这将执行以下操作:
/,因为正则表达式包含/. (我喜欢!并且|因为它们看起来像分割线;其他人使用 @, #,^或他们喜欢的任何东西。可以/在由 分隔的正则表达式中使用/,但对于一个人来说可能很难阅读。)/. (尽可能长。)但它必须在行尾。警告:不包含任何/字符的输入行将被完全删除(即,该行的全部内容将被删除,只留下一个空行)。如果我们想解决这个问题,并让一条没有斜线的行保持不变,我们可以将命令更改为
sed 's!/[^/]*$!/!'
Run Code Online (Sandbox Code Playgroud)
这与第一个答案相同,除了它匹配最后一个/ 及其后的所有字符,然后用 a 替换它们/
(实际上,将最后一个留/在输入行中)。因此,在第一个答案找到one.txt并用空替换它的地方, this 找到/one.txt并用 替换它/。但是,在不包含/字符的行上,第一个答案匹配整行并用空替换它,而这个答案找不到匹配项,因此不会进行替换。
我们可以/在这个命令中用作分隔符,但它必须是
sed 's/\/[^/]*$/\//'
Run Code Online (Sandbox Code Playgroud)
通过与前述他们“逃逸”是正则表达式和替换字符串的一部分斜线后面斜杠(\)。有些人发现这个“倾斜的树木”丛林更难阅读和维护,但基本上归结为风格问题。
| 归档时间: |
|
| 查看次数: |
5347 次 |
| 最近记录: |