使用 shell 减去并替换字符串中的值

使用 shell 减去并替换字符串中的值

我的文件夹中有文件。看起来像

1232_2019_02_09_12_29_29.txt
1232_2019_02_09_12_29_55.txt

我想从文件名中 提取2019_02_09_12_29_29&并将其转换为& 。2019_02_09_12_29_552019-02-09-1229292019-02-09-122955

#!/bin/sh

path=$1

if [[ -z $1 ]];then
        echo "USAGE:: Argument missing, supply full path to list all files"
        exit 1
fi

if [ -f $path/all_files.txt ] ; then
    rm -f $path/all_files.txt
fi

ls -l $path | grep -v "^d" | awk '{print $9}' > $path/all_files.txt

while read -r line
do
        line=${line##*/}
#       echo "${line%"/}"
        ex1=`awk -F'|' '{print substr($1,length($1)-22, 19)}'`
#       ex2=`awk -F'|' '{print substr($1,length($1)-19, 10)}'`
        echo $ex1
        ex2=$(echo $ex1 | cut -c 1-10)
        echo $ex2
        ex3=$(echo $ex1 | cut -c 12-20)
        echo $ex3
done <$path/all_files.txt

但这段代码没有给我想要的输出。

答案1

您可以while用此行替换整个循环:

awk -F'[._]' '{print $2"-"$3"-"$4"-"$5$6$7}' $path/all_files.txt

如果你想保留文件的扩展名(.txt),你应该使用这样的命令:

awk -F_ '{print $2"-"$3"-"$4"-"$5$6$7}' $path/all_files.txt

答案2

我不明白为什么你会投反对票。
您是新贡献者。
你付出你的研究/努力。
所以不客气,抱歉英语不好。

首先,你写 #!/bin/sh ,然后使用 if [[ -z $1 ]]
不是所有的 sh shell 句柄 [[ ,所以使用 if [ -z "$1" ]
总是像 "$1" 这样引用你的
var不要在脚本中使用 ls
您要查找 *.txt 文件,因此不要将文件命名为 all_files.txt,而是用 .log 命名
不要使用 grep cut ... 如果您使用 awk 或 sed,因为 awk 和 sed 可以处理仅此而已。
当您使用 awk 时,不要逐行读取文件,它可以做到这一点。

你可以尝试这样:

#!/bin/sh

if [ -z $1 ];then
    echo "USAGE:: Argument missing, supply full path to list all files"
    exit 1
fi

log="$1/all_files.log"

if [ -f "$log" ] ; then
  rm -f "$log"
else
  echo "no file to rm"
fi

echo "with gnu sed"
find "$1" -maxdepth 1 -type f -name '*.txt' |
  sed 's/[^_]*_//;s/_//4g;s/_/-/g' # > "$log"

echo "with awk"
find "$1" -maxdepth 1 -type f -name '*.txt' |
  awk -F\_ '{for(i=2;i<5;i++)a=a$i"-";a=a$(i++)$(i++)$i;print a;a=""}' # > "$log"

答案3

我已经使用下面的方法来实现相同的目的

awk -F "_" 'OFS="-"{$1="";print $0}' filename|sed "s/\..*//g"| sed 's/^-//g'| awk '{print substr($1,1,13)substr($1,15,2)substr($1,18)}'

输出

2019-02-09-122929
2019-02-09-122955

答案4

使用sed

sed 's/^[^_]*_\(.*\)\..*$/\1/;y/_/-/;s/-\([^-]*\)-\([^-]*\)$/\1\2/' \
     $path/all_files.txt 

相关内容