我有一个文件
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
到命令