我发现输出如下:
/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";
在此示例中,“user”和“Password”的值(“xxxxxxx”;)需要重定向到新文件。 “用户”将始终位于第五目录中,但我不想要 .rstd 扩展名。我的新文件输出应该如下所示
user "xxxxxxxx";
我怎样才能最好地完成这个任务?
答案1
使用 sed
为了方便起见,让我们将 find 输出放入 shell 变量中s
:
$ s='/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'
现在,让我们提取您想要的部分:
$ echo "$s" | sed -E 's|/([^/]*/){4}([^/.]*)[.][^"]*(.*)|\2 \3|'
user "xxxxxxx";
怎么运行的
sed 脚本由单个替代命令组成。该-E
标志用于启用扩展正则表达式。
该行与:
/([^/]*/){4}([^/.]*)[.][^"]*(.*)
/([^/]*/){4}
匹配前四个目录。由于括号的原因,这些目录中的最后一个被保存为组 1,但我们不会使用它。([^/.]*)
匹配不带扩展名的用户名。由于括号的存在,该分组被保存为组 2。[.][^"]*
匹配扩展名以及第一个双引号之前的所有内容。(.*)
匹配从第一个双引号开始到行尾的所有内容。同样,由于括号的原因,这被保存为组 3。替换文本
\2 \3
表示第 2 组,后跟一个空格,后跟第 3 组。
使用 awk
$ echo "$s" | awk -v FS="/" '{ name=$6; sub(/[.].*/,"", name); sub(/[^"]*/, ""); print name, $0;}'
user "xxxxxxx";
怎么运行的
-v FS="/"
这会将字段分隔符设置为
/
。name=$6; sub(/[.].*/,"", name)
由于 awk 对字段进行计数,因此名称位于第六个字段中。我们将第六个字段保存在变量中
name
,然后删除name
第一个句点之后的所有内容。sub(/[^"]*/, "")
这会删除该行中直到但不包括第一个的所有内容
"
。print name, $0
这将打印名称、字段分隔符(默认为空格)以及替换后该行剩下的内容(密码)。
答案2
您可以使用sed
分组来做到这一点,
$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";' | \
sed 's,\(^/var.*stores/\)\(user\)\(.rstd.*= \)\(.*\),\2 \4,'
user "xxxxxxx";
我知道这看起来很奇怪;) 或者你可以使用更简单的
sed -e 's,/var/data/run/stores/,,;s,\..*=,,'
答案3
很长......但似乎有效
$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";' | \
awk -F/ ' { print $6 $7} ' | awk -F"." ' { print $1, " ", $3 } ' | \
awk ' { print $1 " " $NF } '
user "xxxxxxx";
答案4
使用珀尔
~$ perl -pe 's{^(\/[^/]+){4}\/(\w+)\.rstd\/[^/ ]+\hPassword\h\=\h\"(.+)\"}{$2 $3};' file
#OR (with \x option)
~$ perl -pe 's{ ^ ( \/ [^/]+ ){4} \/ (\w+) \. rstd \/ [^/ ]+ \h Password \h \= \h \" (.+) \" }{$2 $3}x;' file
使用乐(以前称为 Perl_6)
~$ raku -pe 's{ ^ [ \/ <-[ / ]>+ ]**4 \/ (\w+) \. rstd \/ <-[ / \h ]>+ \h Password \h \= \h \" (.+) \" } = "$0 $1";' file
#OR (much more explicitly)
~$ raku -pe 's{ ^ [ \c[SOLIDUS] <-[ \c[SOLIDUS] ]>+ ]**4 \c[SOLIDUS] (\w+) \.rstd \c[SOLIDUS] <-[ \c[SOLIDUS] \c[SPACE] ]>+ \c[SPACE] Password \c[SPACE] \= \c[SPACE] \c[QUOTATION MARK] (.+) \c[QUOTATION MARK] } = "$0 $1";' file
输入示例:
/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";
示例输出(所有 4 个示例):
user xxxxxxx;
Perl 参考资料:
https://perldoc.perl.org/perlrequick
https://perldoc.perl.org/perlre
乐库参考资料:
https://docs.raku.org/language/regexes
https://docs.raku.org/language/regexes-best-practices