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
用来指定一个分隔符来分割字符串,而不是使用分隔符来打印列?
管道通过 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\
是转义字符。
与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}
语法是参数扩展,这条从它的参数最短的前缀。