쉘스크립트로 파일의 내용을 바꾸려고 합니다.
글쓴이: quintus / 작성시간: 화, 2004/02/03 - 2:56오후
test.txt 파일안의 total=0 이라는 부분을 1만큼 증가시키고 싶거든요
total='grep ^total test.txt | cut -f2 -d "="'
total=$(($total+1))
sed "s/^total=.*/total=$total/"
이렇게 하면 될거 같은데 안 되네요.
아니면
sed 의 substitution을 사용해서
sed "s/^total=./total=$(($.+1))"
이렇게 하면 안되나요??
파일 속의 변수의 값을 증가시키고 싶은데 어떻게 해야하는지...
참 그리고 grep ^total test.txt 의 ^는 파일에서 처음나오는 total이라는 뜻 맞나요?
Forums:
이런...
역 따옴표를 써야 하는걸 그냥 작은 따옴표를 써서 계속 에러가 난거 였습니다.
total=`grep total test.txt | cut -f2 -d =`
total=$(($total+1))
touch tmp$$
sed "s/total.*/total=$total/" test.txt > tmp$$
mv tmp$$ test.txt
rm -f tmp$$
근데 cut -f2 -d = 에서 딜리미터로 =를 쓰면 다음 등호까지의 내용들이 모두 total에 저장되네요. 딜리미터로 공백문자를 쓰니까 되긴 하는데 "="를 사용하면서 해결할 수 있을까요? 딜리미터와 행의 마지막까지만 범위를 지정해서 cut 할 수 있나요?
아. 그리고 행의 시작은 ^ 행의 끝은 $인거 알겠는데
carrage return의 정규표현식은 어떤거죠?
쉘프로그래밍으로 파일내의 숫자값을 증가 시키는 더 좋은 방법은 없나요?
[code:1]awk -F'=' '{ if (
위에꺼는 a=숫자 로 된 모든 것을 찾아서 1을 증가시켜 주고
아래것은 문장의 처음이 total= 로 시작되는 곳만 찾아서 변경시켜 줍니다.
결과를 redirection 시켜는 부분은 동일하게 처리하면 됩니다~
>/dev/null 2>&1
[code:1]perl -pi -e 's/(?<=tota
[0-9]는 숫자 하나를 말합니다.
[0-9]*는 연속된 숫자들을(그러니까 두자리 이상의 숫자들) 말합니다.
([0-9]*)은 [0-9]*에 대응한 값들을 변수 $1에 넣는 것을 말합니다.
(?<=패턴)은 패턴이 앞에 있는 경우를 말합니다. 즉,
(?<=abc)def의 경우, abcdef에는 대응되지만 xzydef에는 대응되지 않습니다. 더 중요한 것은 abc가 대응된 내용($&)에선 빠진다는 점입니다. 즉,
"I know abcdef is the leading alphabet order."라는 문장이 있을 때,
s/abcdef/xyz/ 라는 명령어는
"I know xyz is the leading alphabet order."이라는 문장을 만들지만,
s/(?<=abc)def/xyz/ 라는 명령어는
"I know abcxyz is the leading alphabet order."가 됩니다.
따라서,
(?<=total=)([0-9]*) 라는 내용은,
total= 이라는 문구로 시작하는 한자리 이상의 숫자가 됩니다. 그리고 그 숫자는 $1에 저장됩니다.
s/.../.../e 에서 맨 끝의 e는, 치환 대상을 문자열이 아니라 명령어로 인식되게 해줍니다. 즉,
s/(?<=total=)([0-9]*)/$1+1/ 라고 하면 (끝에 e가 없음)
total=0+1 으로 출력이 되지만,
s/(?<=total=)([0-9]*)/$1+1/e 라고 하면
total=1이라고 계산 되서 출력이 됩니다.
[/code]
댓글 달기