use*_*029 1 sed awk text-processing text-formatting
我发现输出如下:
/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";
Run Code Online (Sandbox Code Playgroud)
在此示例中,“user”和“Password”的值(“xxxxxxx”;)需要重定向到新文件。“用户”将始终位于第五目录中,但我不想要 .rstd 扩展名。我的新文件输出应该如下所示
user "xxxxxxxx";
Run Code Online (Sandbox Code Playgroud)
我怎样才能最好地完成这个任务?
为了方便起见,让我们将 find 输出放入 shell 变量中s:
$ s='/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'
Run Code Online (Sandbox Code Playgroud)
现在,让我们提取您想要的部分:
$ echo "$s" | sed -E 's|/([^/]*/){4}([^/.]*)[.][^"]*(.*)|\2 \3|'
user "xxxxxxx";
Run Code Online (Sandbox Code Playgroud)
sed 脚本由单个替代命令组成。该-E标志用于启用扩展正则表达式。
该行与:/([^/]*/){4}([^/.]*)[.][^"]*(.*)
/([^/]*/){4}匹配前四个目录。由于括号的原因,这些目录中的最后一个被保存为组 1,但我们不会使用它。
([^/.]*)匹配不带扩展名的用户名。由于括号的存在,该分组被保存为组 2。
[.][^"]*匹配扩展名以及第一个双引号之前的所有内容。
(.*)匹配从第一个双引号开始到行尾的所有内容。同样,由于括号的原因,这被保存为组 3。
替换文本\2 \3表示第 2 组,后跟一个空格,后跟第 3 组。
$ echo "$s" | awk -v FS="/" '{ name=$6; sub(/[.].*/,"", name); sub(/[^"]*/, ""); print name, $0;}'
user "xxxxxxx";
Run Code Online (Sandbox Code Playgroud)
-v FS="/"
这会将字段分隔符设置为/。
name=$6; sub(/[.].*/,"", name)
由于 awk 对字段进行计数,因此名称位于第六个字段中。我们将第六个字段保存在变量中name,然后删除name第一个句点之后的所有内容。
sub(/[^"]*/, "")
这会删除该行中直到但不包括第一个的所有内容"。
print name, $0
这将打印名称、字段分隔符(默认为空格)以及替换后该行剩下的内容(密码)。