Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 提取文件名_Unix_Sed - Fatal编程技术网

Unix 提取文件名

Unix 提取文件名,unix,sed,Unix,Sed,因此,我是SED和Unix新手,希望替换以下文件: 1500:../someFile.C:111 error 1869:../anotherFile.C:222 error 1869:../anotherFile2.Cxx:333 error //thousands of more lines with same structure 使用下面的文件 someFile.c anotherFile.c anotherFile2.Cxx 基本上,我只想从每一行提取文件名 到目前为止,我已经阅读了有

因此,我是SED和Unix新手,希望替换以下文件:

1500:../someFile.C:111 error
1869:../anotherFile.C:222 error
1869:../anotherFile2.Cxx:333 error
//thousands of more lines with same structure
使用下面的文件

someFile.c
anotherFile.c
anotherFile2.Cxx
基本上,我只想从每一行提取文件名

到目前为止,我已经阅读了有关sed的文档和第二个答案。我最好的尝试是使用正则表达式,如下所示:

sed "s/.\*\/.:.*//g" myFile.txt

您可以捕获上一个
/
和下一个
之间的子字符串,并用捕获的字符串替换整个字符串(
\1

或者,使用
-r
标志进行sed,转义稍微少一些

sed -r 's#.*/([^:]+).*#\1#g' myFile.txt
或者,如果您想使用
grep
,则只有当
grep
支持将启用
PCRE
-p
标志时,这才有效:

grep -oP '.*/\K[^:]+' myFile.txt
someFile.C
anotherFile.C
anotherFile2.Cxx

您可以捕获上一个
/
和下一个
之间的子字符串,并用捕获的字符串替换整个字符串(
\1

或者,使用
-r
标志进行sed,转义稍微少一些

sed -r 's#.*/([^:]+).*#\1#g' myFile.txt
或者,如果您想使用
grep
,则只有当
grep
支持将启用
PCRE
-p
标志时,这才有效:

grep -oP '.*/\K[^:]+' myFile.txt
someFile.C
anotherFile.C
anotherFile2.Cxx

有很多方法可以做到这一点

当然,您可以使用
sed

sed 's/^[^:]*://;s/:.*//;s#\.\./##' input.txt
sed 's%.*:\.\./\([^:]*\):.*%\1%' input.txt
或者您可以在管道中使用一系列
grep-o
实例:

grep -o ':[^:]*:' input.txt | grep -o '[^:]\{1,\}' | grep -o '/.*' | grep -o '[^/]\{1,\}'
您甚至可以使用
awk

awk -F: '{sub(/\.\.\//,"",$2); print $2}' input.txt
但最简单的方法可能是使用
cut

cut -d: -f2 input.txt | cut -d/ -f2

有很多方法可以做到这一点

当然,您可以使用
sed

sed 's/^[^:]*://;s/:.*//;s#\.\./##' input.txt
sed 's%.*:\.\./\([^:]*\):.*%\1%' input.txt
或者您可以在管道中使用一系列
grep-o
实例:

grep -o ':[^:]*:' input.txt | grep -o '[^:]\{1,\}' | grep -o '/.*' | grep -o '[^/]\{1,\}'
您甚至可以使用
awk

awk -F: '{sub(/\.\.\//,"",$2); print $2}' input.txt
但最简单的方法可能是使用
cut

cut -d: -f2 input.txt | cut -d/ -f2

您在哪里剪切(是的,您可以使用
cut
两次)?从最后一个
/
开始,直到最后一个
?@user3586940如果任何答案对您有帮助,请接受答案。您在哪里剪切(是的,您可以使用
剪切
两次)?从最后一个
/
开始,直到最后一个
?@user3586940如果任何答案对您有帮助,请接受答案。