SED를 사용하여 4자리만 확인하세요.

SED를 사용하여 4자리만 확인하세요.

SED 명령에서는 SED만 존재하기를 원합니다 SOMETHING_4DigitsHereOnly_SOMETHING2.

예를 들어 파일 이름이 ITALY_2022_BEST1FRIENDS2_ROME.txt. 이면 원하는데 2022_BEST1FRIENDS2이름이 지정되면 ITALY_202345_BEST1FRIENDS2_ROME.txt4자리가 아니라 4자리를 초과하므로 오류가 발생합니다. 패턴을 찾을 수 없으면 쉘 스크립트에서 오류를 표시하고 싶습니다.

username=$(find . -iname '*.txt' | sed -e 's/.*_\([0-9]\{4\}_[0-9|A-z]*\).*/\1/i' | sort - | uniq -ui |tr -d '\n')

grep 코드는 동일한 작업을 수행하지만 @frabjous 사용자 덕분에 파일이 일치하지 않으면 오류가 발생합니다.

read filename
set -o pipefail
filename_trimmed=$(echo $filename | grep -o '[0-9]\{4\}_[0-9|A-z]*' -i | sort - | uniq -ui |tr -d '\n')
# get the exit status of the previous command
pipeexit="$?"
set +o pipefail
if [[ "$pipeexit" != 0 ]] ; then
    echo "FILENAME not found" >&2
    # line below quits the script; remove if you don't want that
    exit "$pipeexit"
fi
echo trimmed mmc is  $filename_trimmed

이전 질문 및 자세한 내용은 여기를 참조하세요.SED를 사용하여 파일 이름의 일부 추출 SED 및 REGEX 추출, 패턴이 없으면 거부 감사합니다! !

답변1

sed 대화를 이해하는 것이 훨씬 더 어렵다는 것을 알았습니다. 나는 대부분의 경우 awk를 선호합니다.

이를 감안할 때 문제에 대한 한 가지 해결책은 다음 스크립트입니다. 보시다시피 따라야 할 논리가 더 명확해집니다(장기간 동안만 코드를 다시 방문하는 경우 이는 코드 유지 관리의 핵심입니다.):

#!/bin/sh                                                                                                                               

BASE=`basename "$0" ".sh" `
TMP="/tmp/tmp.$$.${BASE}"               ; rm -f "${TMP}"

START=`pwd`
REPORT="${START}/${BASE}.report"    ; rm -f "${REPORT}"

if [ -n "${1}" ]
then
    EVAL_DIR="$1"
else
    EVAL_DIR="."
fi


############
#find "${EVAL_DIR}" -iname '*.txt' -print | sed 's+\.txt$++'
#exit 0
############

find "${EVAL_DIR}" -iname '*.txt' -print | sed 's+\.txt$++' | sort |
    awk -F _ -v suf="txt" '\
        function is_integer(x) {
            if( index(x, ".") != 0 ){
                return 0 ;
            } ;
            if( x + 0 == x && int(x) == x ){
                return 1 ;
            }else{
                return 0 ;
            } ;
        }
        ! is_integer($2) {
            printf("#ERROR|%s."suf"\n", $0 ) ;
        }
        length($2) == 4 {
            for( i=2 ; i < NF ; i++ ){
                printf("%s_", $i ) ;
            } ;
            print $NF ;
        } ;
        length($2) != 4 {
            printf("#ERROR|%s."suf"\n", $0 ) ;
        }' >"${REPORT}"

exit 0

관련 정보