只有表达式存在时,sed才替换子字符串

时间:2018-08-24 11:06:33

标签: bash

在bash脚本中,我试图删除文件名中的目录名称:

documents/file.txt
direc/file5.txt
file2.txt
file3.txt

因此,我尝试首先查看是否存在“ /”,如果是,请删除之前的所有内容:

for i in **/*.scss *.scss; do
    echo "$i" | sed -n '^/.*\// s/^.*\///p'
done

但是它不适用于当前目录中的文件,它给了我一个空白字符串。

我明白了:

file.txt
file5.txt

4 个答案:

答案 0 :(得分:2)

仅需要文件名时,请使用basename而不是sed

# basename /path/to/file

返回file

答案 1 :(得分:0)

这也可以使用awk bash util。

完成。

示例:

echo "1/2/i.py" | awk 'BEGIN {FS="/"} {print $NF}' output: i.py

答案 2 :(得分:0)

您的sed尝试基本上可以,但是无论您是否进行替换,都应打印。最后取出-np。 (也有不相关的语法错误。)

此外,不要不必要地循环遍历所有文件。

printf '%s\n' **/*.scss *.scss |
sed -n 's%^.*/%%p'

答案 3 :(得分:-1)

最终,我做到了:

for i in **/*.scss *.scss; do
    # for i in *.scss; do
# for i in _hm-globals.scss; do

    name=${i##*/} # remove dir name
    name=${name%.scss} # remove extension
    name=`echo "$name" | sed -n "s/^_hm-//p"` # remove _hm-
    if [[ $name = *"."* ]]; then
        name=`echo "$name" | sed -n 's/\./-/p'`  #replace . to --
    fi

    echo "$name" >&2
done