![문자열에서의 위치에 따라 문자를 문자로 바꿉니다.](https://linux55.com/image/101461/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%EC%84%9C%EC%9D%98%20%EC%9C%84%EC%B9%98%EC%97%90%20%EB%94%B0%EB%9D%BC%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EB%AC%B8%EC%9E%90%EB%A1%9C%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
나는 다음과 같은 결과를 얻었습니다.
(2+05:10)
(10:19)
(00:45)
이 출력은 하루의 시간과 분을 나타냅니다. 이것을 얻기 위해 ":"를 각각 "d", "h" 및 "m"으로 바꾸고 싶습니다.
2d05h10m
10h19m
00h45m
현재 제가 시도해본 결과,
sed -e 's/(//g; s/)//g; s/+/:/g'|awk '{split($0,s,":"); print s[1]"d" s[2]"h"s[3]"m"}')
이것은 제공됩니다 (나는 여기서 망하고 있습니다!)
6d05h20m
3d15h17m
1d02h27m
00d08hm
00d11hm
02d25hm
02d30hm
16d50hm
5d00h39m
21d48hm
답변1
~처럼 들리다
< file tr '+:)' dhm | tr -d '('
그렇게 할 것이다. 또는 패턴을 보다 명시적으로 일치시킵니다.
sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g
s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g' < file
일부 sed
구현에서는 확장 정규식을 사용하여 단순화할 수 있습니다.
sed -E 's/\(([0-9]+)\+([0-9]+):([0-9]+)\)/\1d\2h\3m/g
s/\(([0-9]+):([0-9]+)\)/\1h\2m/g' < file
또는 단일 s
명령을 사용하십시오 perl
.
perl -pe 's{\((?:(\d+)\+)?(\d+):(\d+)\)}{
($1 && "$1d") . "$2h$3m"}ge' < file
또는:
perl -pe 's/\((\d*\+?\d+:\d+\))/$1 =~ y|+:)|dhm|r/ge' < file
답변2
간단하지만 약간 덜 효율적인 Perl 스크립트로 충분합니다.
cat output_file | perl simple.pl
Simple.pl
@seps=split /:/,"d:h:m";
while(<>) {
chomp ;
$_=~s/[\(\)]//g; #remove braces
@x = split /:/, $_; #get parts
$s="";
for($i=$#x,$j=$#sep;$i>=0; $i--,$j--) { #iterate on parts and corresponding separator
$s=$x[$i].$seps[$j].$s; #create print string
}
print "$s\n"; #print this line
}
답변3
해결책 이 없습니다 awk
. 다음은 0개의 요소가 생략된 것입니다:
파싱.awk
# Start with empty variables
{ d = h = m="" }
# Determine format and set variables accordingly.
# Force numeric interpretation by multiplying by one
NF==5 { d = $2*1; h = $3*1; m = $4*1 }
NF==4 { d = "" ; h = $2*1; m = $3*1 }
# Only set value if the number is greater than zero
{
d = d > 0 ? d "d" : ""
h = h > 0 ? h "h" : ""
m = m > 0 ? m "m" : ""
}
length(d h m) > 1 { print d h m }
length(d h m) == 0 { print "Now" }
다음과 같이 실행하세요:
awk -f parse.awk -v FS='[()+:]' file
산출:
2d5h10m
10h19m
45m