如何用sed替换ls输出中的变量路径值以简化文件名显示
嘿,我来帮你搞定这个问题!你现在用ls -lrt输出带完整路径的文件,想把路径部分去掉只留文件名,之前用sed替换$path没成功,大概率是因为路径里的斜杠/和sed默认的分隔符冲突了,导致语法出错。下面给你几个实用的解决办法:
方法一:用awk精准替换最后一列的路径
awk处理字段非常方便,我们可以把shell的path变量传给awk,然后只对最后一列(也就是文件名所在列)做替换:
ls -lrt ${path}sample ${path}sample1 | awk -v p="$path" '{sub(p, "", $NF); print $0}'
-v p="$path":把shell的path变量赋值给awk的变量p,避免转义问题sub(p, "", $NF):在最后一列$NF中,把p对应的路径内容替换为空print $0:打印处理后的整行,保留ls -lrt的其他输出信息(权限、时间等)
方法二:换分隔符修复sed命令
如果你坚持想用sed,只要换一个和路径里不冲突的分隔符(比如|)就能解决之前的问题,同时用正则匹配行尾的文件名部分:
ls -lrt ${path}sample ${path}sample1 | sed -E "s|($path)([^ ]+)$|\2|"
-E:开启扩展正则,让写法更简洁s|...|...|:用|作为分隔符,避开路径里的/($path)([^ ]+)$:匹配行尾的完整路径($path+非空格的文件名),然后替换成第二个分组\2(也就是纯文件名)
方法三:循环+basename逐个处理
如果文件数量不多,也可以用循环结合basename命令,逐个替换每个文件的完整路径:
for file in "${path}"sample "${path}"sample1; do ls -lrt "$file" | sed "s|$file|$(basename "$file")|" done
basename "$file":直接提取每个文件的纯文件名sed把整行里的完整路径替换成纯文件名
为什么你之前的sed命令失败?
因为你的path变量是logs/gh/,里面包含sed默认的分隔符/,直接写sed "s/$path//"会让sed误以为logs/是第一个分隔符,后面的gh/是替换内容,导致语法混乱。换个分隔符就能解决这个问题啦!
内容的提问来源于stack exchange,提问作者sireesha
相关产品推荐
相关产品推荐

