쉘스크립트로 파일의 내용을 바꾸려고 합니다.

quintus의 이미지

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이라는 뜻 맞나요?

quintus의 이미지

역 따옴표를 써야 하는걸 그냥 작은 따옴표를 써서 계속 에러가 난거 였습니다.

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의 정규표현식은 어떤거죠?

쉘프로그래밍으로 파일내의 숫자값을 증가 시키는 더 좋은 방법은 없나요?

dreampia의 이미지

awk -F'=' '{
    if (NF == 2) printf("%s=%d\n", $1, $2+1);
    else print $0;
}' test.txt

awk -F'=' '{
    if ($0 ~ /^total/) printf("%s=%d\n", $1, $2+1);
    else print $0;
}' test.txt

위에꺼는 a=숫자 로 된 모든 것을 찾아서 1을 증가시켜 주고
아래것은 문장의 처음이 total= 로 시작되는 곳만 찾아서 변경시켜 줍니다.

결과를 redirection 시켜는 부분은 동일하게 처리하면 됩니다~

>/dev/null 2>&1

dakiller6의 이미지

perl -pi -e 's/(?<=total=)([0-9]*)/$1+1/e' test.txt

[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]

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.