![从字符串中提取“.sh”脚本并重新格式化它们](https://linux22.com/image/153753/%E4%BB%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E6%8F%90%E5%8F%96%E2%80%9C.sh%E2%80%9D%E8%84%9A%E6%9C%AC%E5%B9%B6%E9%87%8D%E6%96%B0%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%AE%83%E4%BB%AC.png)
我有一个像这样的字符串:
%group1 ALL=(ALL) /ora/crs/oracle/product/crs/bin/gsdctl *,/ora/crs/oracle/product/crs/bin/vipca,/ora/app/oracle/ora/Root.sh,/ora/crs/oracle/product/crs/root.sh,/ora/crs/oracle/product/crs/bin/srvctl *,/ora/app/oracle/product/root.sh
输出应该是:(仅打印 .sh 脚本)
/ora/app/oracle/ora/Root.sh
/ora/crs/oracle/product/crs/root.sh
/ora/app/oracle/product/root.sh
答案1
在此示例中,这也适用,因为逗号仅用于分隔绝对路径:
grep -o '/[^,]*\.sh' file
答案2
假设您的行是文件中的唯一行file
,您可以使用sed
cat file | sed 's/,/\n/g' | sed -n '/\.sh$/ p'
第一个sed
命令用换行符替换所有逗号,第二个命令打印以 结尾的所有行.sh
。所以我们也可以不用sed
:
cat file | tr ',' '\n' | grep '\.sh$'
答案3
没有 的替代方案sed
,但仍然容易受到路径/文件名中逗号的影响
grep -Po "(?<=[, ])[^,]*\.sh(?=,|$)" test