아래와 같이 고정된 필드 구분 기호 패턴이 없는 입력 라인이 제공됩니다.
x="15:23:46 Let's do this 15:23:47 It's easy: to do for you 15:23:48 You will ## have solution soon 0"
타임스탬프 패턴을 기반으로 별도의 행으로 분할하려고 하므로 예상되는 출력은 다음과 같습니다.
15:23:46 Let's do this
15:23:47 It's easy: to do for you
15:23:48 You will have solution soon
0
줄 끝에 0이 있다는 점에 유의하세요. 이는 개행 문자에도 인쇄되어야 합니다. 이를 나머지 코드의 반환 상태로 사용해야 합니다.
타임스탬프가 다르면 결과를 얻을 수 있지만 일부가 동일하면 예기치 않은 출력이 발생합니다.
x=”15:23:46시작하자15:23:46쉽습니다: 당신을 위해 해 보세요 15:23:48 당신은 ## 곧 해결책을 찾을 것입니다 0"
이제 두 개의 동일한 타임스탬프가 있음을 확인하세요. 이것이 내가 붙어있는 곳입니다. 예상되는 출력은 다음과 같아야 합니다.
15:23:46 Let's do this
15:23:46 It's easy: to do for you
15:23:48 You will have solution soon
0
내가 사용하는 논리는 배열의 모든 타임스탬프를 가져온 다음 타임스탬프 수와 grep을 반복하여 필요한 데이터를 찾는 것입니다. 고유한 타임스탬프가 있을 때 저에게 적합한 논리는 다음과 같습니다.
#!/bin/sh
timestamp=()
x="15:23:46 Let's do this 15:23:47 It's easy: to do for you 15:23:48 You will have solution soon 0"
timestamp+=(`echo $x | grep -oP '(?>[0-9]{2}:[0-9]{2}:[0-9]{2})'`)
total_timestamps=`echo $x | grep -oP '(?>[0-9]{2}:[0-9]{2}:[0-9]{2})' | wc -l`
status=-1
for i in `seq $total_timestamps`
do
if [ "$i" -ne "$total_timestamps" ]; then
echo $x | grep -oP "(?=${timestamp[i-1]}).*(?=${timestamp[i]})"
fi
if [ "$i" -eq "$total_timestamps" ]; then
echo $x | grep -oP "(?=${timestamp[i-1]}).*(?=${timestamp[i]})" | awk '{$NF=""}1'
status=`echo $x | grep -oP "(?=${timestamp[i-1]}).*(?=${timestamp[i]})" | awk '{print $NF}'`
fi
done
echo $status
타임스탬프가 단일 행의 일부 또는 여러 위치에서 동일할 때 누구든지 나를 도와주거나 비슷한 문제를 해결한 곳으로 리디렉션할 수 있습니까?
답변1
다중 문자 RS 및 RT에 GNU awk 사용:
$ awk -v RS='([0-9]{2}(:[0-9]{2}){2})|(0\n$)' 'NR>1{print pRT $0} {pRT=RT} END{printf "%s", RT}' <<<"$x"
15:23:46 Let's do this
15:23:47 It's easy: to do for you
15:23:48 You will ## have solution soon
0
<<<
또는 쉘에 연산자 가 없는 경우 :
$ echo "$x" | awk -v RS='([0-9]{2}(:[0-9]{2}){2})|(0\n$)' 'NR>1{print pRT $0} {pRT=RT} END{printf "%s", RT}'
15:23:46 Let's do this
15:23:47 It's easy: to do for you
15:23:48 You will ## have solution soon
0
출력 줄에서 후행 공백을 제거하려면 print pRT $0
으로 변경하면 됩니다 print pRT gensub(/\s+$/,"",1,$0)
.
답변2
GNU sed
확장 정규식 모드가 활성화된 스트림 편집기 유틸리티를 사용하십시오 -E
.
(날짜 문자열 또는 끝의 0) 왼쪽에서 공백 문자열을 찾아 이를 개행 문자로 변경합니다. 그런 다음 표준 관용구를 사용하여 P;D
개행 왼쪽의 모든 내용을 인쇄한 다음 자릅니다. 전체 패턴 공간이 소진될 때까지 헹구고 반복합니다.
printf '%s\n' "$x" |
sed -Ee '
s/\s+(([0-9]{2}(:[0-9]{2}){2})|0$)/\n\1/
P;D
' - | cat -A
15:23:46 Let's do this$
15:23:47 It's easy: to do for you$
15:23:48 You will ## have solution soon$
0$