SED 및 REGEX 추출, 패턴이 없으면 거부

SED 및 REGEX 추출, 패턴이 없으면 거부

SED 명령에서 2000_SOMENAME 이후의 모든 항목을 삭제하고 가능하다면 형식을 찾을 수 없으면 오류도 표시하고 싶습니다.

예를 들어 파일 이름이 .인 경우 패턴을 찾을 수 없으면 쉘 스크립트에서 오류를 표시하고 ITALY_2022_BEST1FRIENDS2_ROME.txt싶습니다 .2022_BEST1FRIENDS2

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

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

답변1

이 특별한 경우에는 grep -osed보다 grep을 사용하는 것이 더 합리적일 수 있습니다. 결과가 없으면 grep이 오류와 함께 종료되기 때문입니다. (이렇게 -o하면 전체 줄이 아닌 일치하는 부분만 반환됩니다.)

까다로운 점은 다른 명령으로 파이프를 연결하고 오류가 발생할 경우 종료 상태를 유지하려는 것입니다.

Bash를 사용하는 경우 구성 요소가 실패하면 파이프라인이 실패할 수 있습니다 set -o pipefail( set +o pipefail필요한 경우 다시 설정하여 재설정할 수 있음).

다른 쉘에도 비슷한 방법이 있을 수 있습니다.

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

나는 귀하의 지침에 따라 패턴을 대소문자를 구분하지 않게 만들고( -igrep의 경우 sed 명령에 있음 i) 파이프라인의 나머지 명령을 동일하게 유지했습니다. 이유가 있어서 이렇게 한 것 같습니다. (이 tr명령은 의심스러워 보입니다. 왜 모든 결과를 한 줄에 함께 섞습니까?)

"오류"를 확인하는 더 간단한 방법을 고려할 수도 있습니다. 변수가 $username비어 있는지 확인하고 grep 결과가 없으면 비어 있는 것입니다(물론 find 등으로 .txt를 찾지 못하는 경우). 파일). ; 원하는지 확실하지 않습니다...).

username="$(find . -iname '*.txt' | grep -o -i '[0-9]\{4\}_[0-9A-Z]*' | sort - | uniq -ui |tr -d '\n')"
if [ -z "$username" ] ; then
    echo "username not found" >&2
    exit "$pipeexit"
fi

이것은 다른 쉘에서도 작동할 가능성이 높습니다...

관련 정보