Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Bash 打印匹配并对每个匹配应用转换_Bash_Macos_Awk_Sed - Fatal编程技术网

Bash 打印匹配并对每个匹配应用转换

Bash 打印匹配并对每个匹配应用转换,bash,macos,awk,sed,Bash,Macos,Awk,Sed,对我先前工作的扩展。下面生成的sed输出已与特定的文件模式匹配:[Ll] grep [Ll]earning <file> <match output is...> /Volumes/WD/A/machinelearning-2018-12-01-07_26_05.pdf /Volumes/WD/A/SomeLearningIsGood/Path/machinelearning-2018-12-01-07_26_05.pdf 我知道显示最左边匹配目录的实际表达式是: s

对我先前工作的扩展。下面生成的sed输出已与特定的文件模式匹配:
[Ll]

grep [Ll]earning <file>
<match output is...>

/Volumes/WD/A/machinelearning-2018-12-01-07_26_05.pdf
/Volumes/WD/A/SomeLearningIsGood/Path/machinelearning-2018-12-01-07_26_05.pdf
我知道显示最左边匹配目录的实际表达式是:

sed -n 's/\([Ll]earning[^/]*\/\).*/\1/p' file

matches:
/Volumes/WD/A/SomeLearningIsGood/
更新 在MacOSX(BSDSED/awk)上尝试在Bash3脚本中执行此操作。BSD sed上运行的问题。见更新2

更新2 通过MacPorts/Homebrew安装gsed(GNU sed),并遵循@Aaron提供的解决方案。工作起来很有魅力

brew install gnu-sed
port install gsed

这可能是您正在寻找的:

sed -En '\@[Ll]earning[^/]*/@{h;s@([Ll]earning[^/]*/).*@\1@;H;x;s/\n/ : /p;t};s/.*[Ll]earning.*/& : 0/p'
无需事先进行
grep
,它可以过滤出结果,而不会[Ll]盈利

你可以

这里有一个兼容POSIX的替代方案:

sed -n '/[Ll]earning[^\/]*\//{h;s/\([Ll]earning[^\/]*\/\).*/\1/;H;x;s/\n/ : /p;t};s/.*[Ll]earning.*/& : 0/p'
你可以


另外,如果您不需要在没有
[Ll]收入的情况下过滤掉行,那么它会简单得多

不完全是您想要的,但是使用
sed-n'/[Ll]earning/s~(^.*/[Ll]earning/\).*.&:\1~p'文件
@cmbuckley echo'/Volumes/WD/A/machinelearning-2018-12-01-07\u 26\u 05.pdf';sed-n'/[Ll]earning/s~(^.*/[Ll]earning/.*))可以只在匹配的行上打印引导路径,并且:\1~p'为空?但是,它在第二个文件中确实有效。这就是为什么我说它不是您想要的:)是的,条件逻辑可能需要一个awk表达式。
/Volumes/MachineLearningCourses/noname.com/ml-101.pdf
的输出应该是什么?冒号后面的部分是否应该是
/Volumes/MachineLearningCourses/noname.com
?或者它不算数,因为路径元素不是
../Learning/..
?注释不用于扩展讨论;这段对话可能比较简单。
sed-E'/^(.[Li]赚取[^/]*\/)./s/&:\1/;Ts/$/:0/'file
@potong与我的原始答案相同的问题:当有两个
/.[Ll]赚取。*/
dir时,它返回最深的一个,而OP想要最上面的一个。这让事情变得很难看…@Aaron我明白了!另一种选择是:
sed-E'/[Ll]赚取[^/]*\/!s/$/:0/;Ts/&\n/;s/(.*)\n(.*)/\1\2:\1/'文件
@potong仍然有一个区别,它不会过滤掉没有
[Ll]盈利的行路径
,但我相信OP并不关心它们,因为他以前使用的是
grep
sed -n '/[Ll]earning[^\/]*\//{h;s/\([Ll]earning[^\/]*\/\).*/\1/;H;x;s/\n/ : /p;t};s/.*[Ll]earning.*/& : 0/p'