[질문] 특정문자열을 찾아서 원하는 문자열로 바꾸어주는 방법에

irdeal의 이미지

얼마전에 회사에 들어와서 리눅스 상에서 작업을 하게 됬는데, 초보라 많은 부분이 막힙니다.

여러 프로그램들을 설치를 해보고 있는데 설정상 경로를 수정을 해주어야 하는 경우가 많습니다. 하나하나 수정을 하고 있는데요, 어떤경우는 똑같은 수정을 여러군데 해주어야 하는경우가 많아서요 이를 좀 편하게 하려면 어떻게 해야할까요?

예를 들어서 이런 경우입니다. ldk라는 디렉토리가 있다고 하면 그 밑에 많은 파일들이 /usr/lib/ldk 라는 문자열을 가지고 있습니다. 이것들을 /home/irdeal/ldk 라는 문자열로 바꾸어 주고 싶거든요.

많은 고수님들의 가르침을 기다리겠습니다.

mithrandir의 이미지

vim의 치환기능,

sed/awk,

perl,

ruby

등을 사용하면 손쉽게 대량의 문자열을 치환할 수 있습니다.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

M.W.Park의 이미지

irdeal wrote:
얼마전에 회사에 들어와서 리눅스 상에서 작업을 하게 ㅤㄷㅚㅆ는데, 초보라 많은 부분이 막힙니다.

여러 프로그램들을 설치를 해보고 있는데 설정상 경로를 수정을 해주어야 하는 경우가 많습니다. 하나하나 수정을 하고 있는데요, 어떤경우는 똑같은 수정을 여러군데 해주어야 하는경우가 많아서요 이를 좀 편하게 하려면 어떻게 해야할까요?

예를 들어서 이런 경우입니다. ldk라는 디렉토리가 있다고 하면 그 밑에 많은 파일들이 /usr/lib/ldk 라는 문자열을 가지고 있습니다. 이것들을 /home/irdeal/ldk 라는 문자열로 바꾸어 주고 싶거든요.

많은 고수님들의 가르침을 기다리겠습니다.

이런건 치환을 해도 되지만 보통은 환경변수를 이용하지 않나요?

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

nahanjang의 이미지

전에 여러파일에서 문자열을 수정하는게 귀찮아서 만들었었는데 ...
도움이 될진 모르겠군요.

#!/bin/sh
if expr "$#" \>= 3 >/dev/null
then
    :
else
    echo "\n Usage : $0 \"findstring\" \"changstring\" filename\n\n"
    exit
fi

Para1=$1
Para2=$2

trap 'rm -f file.lst file1.lst; exit' 0 1 2 15
shift
shift
grep -l "$Para1" $* > file.lst 

exec 4<&0
while read file_name
do
    echo "\n\n------- spot a \"$Para1\" in the $file_name File -------"
    grep  "$Para1" $file_name
    echo "Replace [$Para1] => [$Para2] ? [y | q | Other(next)] ? \c"
    exec 5<&0
    exec 0<&4
    read choose
    exec 0<&5
    case $choose in
        [yY])
              cat $file_name | sed -e "s/$Para1/$Para2/g" > tmp.change.txt
              mv tmp.change.txt $file_name
              echo "$file_name done.."
              ;;
        [qQ]) exit
              ;;
        *)    ;;
    esac
done < file.lst
irdeal의 이미지

덕분에 도움이 많이 되었습니다. 여러파일들을 물어보지 않고 다 바꿀수 있도록 해보았는데요. 의문사항이 있습니다.

#!/bin/sh
if expr "$#" \>= 3 >/dev/null
then
    :
else
    echo "\n Usage : $0 \"findstring\" \"changstring\" filename \n\n"
    exit
fi

Para1=$1
Para2=$2

trap 'rm -f file.lst file1.lst; exit' 0 1 2 15
shift
shift
grep -l "$Para1" $* > testtest

exec 4<&0
while read file_name
do
    echo "\n\n------- spot a \"$Para1\" in the $file_name File -------"
    grep  "$Para1" $file_name
    echo "Replace [$Para1] => [$Para2] ? [y | q | a | Other(next)] ? \c"
    exec 5<&0
    exec 0<&4
    read choose
    exec 0<&5
    case $choose in
        [yY])
              echo "$Para1 $Para2 $file_name"
              cat $file_name | sed "s/$Para1/$Para2/g" > tmp.change.txt
              mv tmp.change.txt $file_name
              echo "$file_name done.."
              ;;
        [qQ]) exit
              ;;
        [aA])
              cat $file_name | sed -e "s/$Para1/$Para2/g" > tmp.change.txt

              while read file_name
              do
                cat $file_name | sed -e "s/$Para1/$Para2/g" > tmp.change.txt
                mv tmp.change.txt $file_name
                echo "$file_name done.."
              done < testtest

              exit
              ;;

        *)    ;;
    esac
done < testtest

그런데 위 코드에 보며는 exec 5<&0 exec 0<&4 exec 0<&5 라는 부분은 어떤역활을 하는 것인지요?

감사합니다.

May The Force Be With You
irdeal

nahanjang의 이미지

도움이 되었다니 기쁘군요.
exec 부분은 다음 문서를 참고 하시기 바랍니다.

http//kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/x10307.html

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.