在两个双引号之间使用 sed 获取子字符串

Xem*_*emX 17 sed

我有一个文件

xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)
Run Code Online (Sandbox Code Playgroud)

现在我只想提取文件路径并将其存储到另一个文件中。输出文件是这样的:

/home/path/to/file 
/home/path/to/file1 
/home/path/to/file2
/home/path/to/file3
Run Code Online (Sandbox Code Playgroud)

使用 sed 或 awk 我该怎么做?

我试过了,sed -n '/"/,/"/p' myfile但它不工作。

小智 20

您可以将 rsync 命令的 stderr 通过管道传输到 awk 脚本:

awk -F '"' '{print $2}' 
Run Code Online (Sandbox Code Playgroud)

或者像这样的剪切命令:

cut -d'"' -f2
Run Code Online (Sandbox Code Playgroud)

  • 或者,更短的:`cut -d\" -f2` (2认同)

Jon*_*ler 7

使用sed

sed 's/^[^"]*"\([^"]*\)".*/\1/'
Run Code Online (Sandbox Code Playgroud)

查找:行首、一系列非引号、双引号、捕获一系列非引号、双引号和该行上的任何其他内容,并用捕获的材料替换它。

$ sed 's/^[^"]*"\([^"]*\)".*/\1/' <<'EOF'
> xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
> "/home/path/to/file1": Permission denied (13) rsync:
> "/home/path/to/file2": Permission denied (13) rsync:
> "/home/path/to/file3": Permission denied (13)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$
Run Code Online (Sandbox Code Playgroud)

在带有 GNU 的 RHEL 5 Linux 上进行测试sed,但仅使用在第 7 版 UNIX™ 版本的sed.

顺便说一下,一个稍微简单的方法是使用两个替代命令;将包括第一个双引号在内的所有内容更改为空字符串(这是零个或多个非引号后跟双引号的序列);将现在第一个双引号之后的所有内容更改为空:

sed 's/^[^"]*"//; s/".*//'
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您尝试的命令 (`sed -n '/"/,/"/p') 从包含双引号的一行打印到包含双引号的下一行,根本不编辑这些行。这就是为什么它似乎对你不起作用——它做了你要求的,但你要求它做的并不是你想要它做的。

在效率方面,性能不太可能存在可测量的差异。在易于维护方面,我怀疑后者对脑细胞的负担较小。