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

使用 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)

现在我想仅提取文件路径并将其存储到另一个文件中。输出文件如下:

/home/path/to/file 
/home/path/to/file1 
/home/path/to/file2
/home/path/to/file3

使用 sed 或 awk 我该如何做到这一点?

我已尝试过sed -n '/"/,/"/p' myfile,但是没有作用。

答案1

您可以将 rsync 命令的 stderr 传送到 awk 脚本:

awk -F '"' '{print $2}' 

或者像这样的剪切命令:

cut -d'"' -f2

答案2

使用sed

sed 's/^[^"]*"\([^"]*\)".*/\1/'

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

$ 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
$

在带有 GNU 的 RHEL 5 Linux 上进行测试sed,但仅使用可以在第 7 版 UNIX™ 版本中运行的功能sed

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

sed 's/^[^"]*"//; s/".*//'

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

从效率角度来看,性能上不太可能有明显的差异。从维护的简易性来看,我怀疑后者对脑细胞的负担更小。

答案3

如果你的版本grep支持 Perl-regexp:

grep -oP '(?<=")/home/.*?(?=")' file >> anotherfile

结果:

/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3

如果您愿意,您还可以使这个不太严格,以匹配双打之间的任何内容:

grep -oP '(?<=")[^"]*' file >> anotherfile

答案4

使用 >> 运算符将任何输出保存到文件。

喜欢

grep -r "pattern" * >> file.txt

因此,只需使用 sed 通过附加内容来针对您的特定场景进行更改即可

>> filename

到命令

相关内容