쉘을 사용하여 문자열에서 값 빼기 및 바꾸기

쉘을 사용하여 문자열에서 값 빼기 및 바꾸기

내 폴더에 파일이 있습니다. 처럼 보인다

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 쉘이 [[ 을 처리하는 것은 아니므로 if [ -z "$1" ] 를 사용하여
항상 "$1"
var don'
*.txt 파일을 찾으려는 스크립트에서 ls를 사용 하지 마십시오. 따라서 파일 이름을 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 

관련 정보