打印第 n 个分隔符后的所有内容

joh*_*doe 0 bash text-processing

如何在第 n 个分隔符之后打印字符串的其余部分(不仅仅是没有分隔符的列)?

我有一个包含一堆注册表项的文本文件,类似于:

hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary
Run Code Online (Sandbox Code Playgroud)

我想在第三个\字符之后打印所有内容。所以我正在寻找输出

software\microsoft\windows\currentversion\runonce\delete cached update binary
Run Code Online (Sandbox Code Playgroud)

我知道如何用 打印出特定的列awk,但是有没有什么简单的方法可以bash用来指定一个分隔符来分割字符串,而不是使用分隔符来打印列?

use*_*593 7

管道通过 cut -d \\ -f 4-

echo 'hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary' | cut -d \\ -f 4-
Run Code Online (Sandbox Code Playgroud)

产量:

software\microsoft\windows\currentversion\runonce\delete cached update binary
Run Code Online (Sandbox Code Playgroud)

注意 double \\,因为 single\是转义字符。


αғs*_*нιη 6

sed

sed -E 's/^([^\]*[\]){3}//' infile
Run Code Online (Sandbox Code Playgroud)

或相同awk

awk '{ sub(/([^\\]*[\\]){3}/, "") }1' infile
Run Code Online (Sandbox Code Playgroud)

比赛重复(regex)3次;[^\]*[\]匹配零个或多个任意字符,但不匹配反斜杠(特殊情况下不加上换行符)后跟反斜杠字符。


和外壳(POSIX sh/bash/Korn/zsh)解决方案:

$ str='hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary'
$ for i in $(seq 3); do str="${str#*\\}"; done
$ printf '%s\n' "$str"
Run Code Online (Sandbox Code Playgroud)

${parameter#word}语法是参数扩展,这条从它的参数最短的前缀。