code

Bash 명령에서 텍스트파일 내 검색 및 치환

starcafe 2023. 4. 13. 21:00
반응형

Bash 명령에서 텍스트파일 내 검색 및 치환

문자열의 및을 가장 하는 를 들어, 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」 「」abc.XYZ/tmp/file.txt

SSH를 통해 명령을 실행하기 위해 앱을 작성하고 IronPython을 사용하고 있지만 Unix에 대해서는 잘 모르기 때문에 무엇을 찾아야 할지 모르겠습니다.

Bash는 명령줄 인터페이스일 뿐만 아니라 매우 강력한 스크립트 언어라고 들었습니다.그래서 이게 사실이라면 이런 행동을 할 수 있을 것 같아요.

bash와 함께 할 수 있습니까?목표를 달성하기 위해 가장 간단한 (한 줄) 스크립트는 무엇입니까?

가장 쉬운 방법은 sed(또는 perl)를 사용하는 것입니다.

sed -i -e 's/abc/XYZ/g' /tmp/file.txt

합니다.-i 할 수 .배시

bash만을 사용하는 경우는, 다음의 조작을 실행할 수 있습니다.

while IFS='' read -r a; do
    echo "${a//abc/XYZ}"
done < /tmp/file.txt > /tmp/file.txt.t
mv /tmp/file.txt{.t,}

이것은, 각 행에 걸쳐 루프 해 치환을 실시해, 임시 파일에 씁니다(입력을 방해하고 싶지 않습니다).마지막 이동은 원래 이름으로 임시로 이동합니다(강건성과 보안을 위해 임시 파일 이름은 정적 또는 예측 가능해야 합니다. 단, 이 파일 이름은 이동하지 마십시오.

Mac 사용자의 경우:

sed -i '' 's/abc/XYZ/g' /tmp/file.txt

(이유는 다음 코멘트를 참조해 주세요.)

파일 조작은 일반적으로 Bash가 실행하는 것이 아니라 Bash가 호출하는 프로그램에 의해 수행됩니다.

perl -pi -e 's/abc/XYZ/g' /tmp/file.txt

-i플래그를 지정하면 인플레이스 치환을 수행할 수 있습니다.

것은, 을 참조하십시오.man perlrun원본 파일을 백업하는 방법 등 자세한 내용을 참조하십시오.

이거에 걸려 넘어졌을 때 깜짝 놀랐어요.

게 요.replace 되어 있는 "mysql-server"패키지를 인스톨 하고 있는 경우는, 다음과 같이 시험해 주세요.

# replace string abc to XYZ in files
replace "abc" "XYZ" -- file.txt file2.txt file3.txt

# or pipe an echo to replace
echo "abcdef" |replace "abc" "XYZ"

것은, 을 참조하십시오.man replace자세한 것은 이쪽입니다.

이것은 오래된 게시물이지만 @centurian이 말한 것처럼 변수를 사용하고 싶은 사람에게는 작은 따옴표가 확장되지 않는 것을 의미합니다.

변수를 삽입하는 간단한 방법은 문자열 연결을 수행하는 것입니다. 문자열 연결은 bash의 병렬 배치에 의해 수행되므로 다음과 같이 작동합니다.

sed -i -e "s/$var1/$var2/g" /tmp/file.txt

Bash는 다른 셸과 마찬가지로 다른 명령어를 조정하기 위한 도구일 뿐입니다.일반적으로 표준 UNIX 명령을 사용하려고 하지만 물론 Bash를 사용하여 컴파일된 프로그램, 다른 셸 스크립트, Python 및 Perl 스크립트 등을 포함한 모든 것을 호출할 수 있습니다.

이 경우 몇 가지 방법이 있습니다.

파일을 읽고 다른 파일에 쓰려면 검색/바꾸기를 진행하면서 sed를 사용합니다.

    sed 's/abc/XYZ/g' <infile >outfile

파일을 편집하려면(편집기에서 파일을 열고 편집한 다음 저장하는 것처럼) 라인 편집기에 지시사항을 제공합니다 'ex'

    echo "%s/abc/XYZ/g
    w
    q
    " | ex file

를 들면 '보다 낫다'와 같은 것입니다.vi풀스크린 모드를 사용하지 않습니다.는 은은명명 you you you you you 에서와 같은 명령어는 you you you you you you you you you you you you you you you you you you 。vi의 »:★★★★★★★★★★★★★★★★★★.

다른 것 중에서 이 스레드를 발견했는데, 가장 완전한 답변이 포함되어 있는 것에 동의하기 때문에 저도 추가합니다.

  1. sed ★★★★★★★★★★★★★★★★★」ed.@Johnny 。

    sed -i -e 's/abc/XYZ/g' /tmp/file.txt
    
  2. 셸 스크립트에서 사용하는 경우 "abc" 또는 "XYZ" 대신 내부에서 변수를 사용할 수 없습니다.배쉬FAQ는 적어도 제가 이해하는 것과 일치하는 것 같습니다.사용할 수 없습니다.

    x='abc'
    y='XYZ'
    sed -i -e 's/$x/$y/g' /tmp/file.txt
    #or,
    sed -i -e "s/$x/$y/g" /tmp/file.txt
    

    지만만 우리 ?? ???@@Johnny를 합니다.while read...과 같은 잘 통했다.하다

    #edit user's virtual domain
    result=
    #if nullglob is set then, unset it temporarily
    is_nullglob=$( shopt -s | egrep -i '*nullglob' )
    if [[ is_nullglob ]]; then
       shopt -u nullglob
    fi
    while IFS= read -r line; do
       line="${line//'<servername>'/$server}"
       line="${line//'<serveralias>'/$alias}"
       line="${line//'<user>'/$user}"
       line="${line//'<group>'/$group}"
       result="$result""$line"'\n'
    done < $tmp
    echo -e $result > $tmp
    #if nullglob was set then, re-enable it
    if [[ is_nullglob ]]; then
       shopt -s nullglob
    fi
    #move user's virtual domain to Apache 2 domain directory
    ......
    
  3. 알 수 nullglob 경우, 「」, 「」, 「」, 「」, 「」, 「」를이 있는 , 이상하게 동작합니다.*

    <VirtualHost *:80>
     ServerName www.example.com
    

    어느 쪽이 되느냐

    <VirtualHost ServerName www.example.com
    

    끝 괄호는 없고 Apache2는 로딩도 되지 않습니다.

  4. 이러한 종류의 해석은 원히트 검색 및 치환보다 느리지만 이미 보셨듯이 1개의 해석 사이클로 동작하는4개의 다른 검색 패턴에는 4개의 변수가 있습니다.

주어진 문제의 가정으로 생각할 수 있는 가장 적절한 해결책.

하시면 됩니다.sed:

sed -i 's/abc/XYZ/gi' /tmp/file.txt

하시면 됩니다.find ★★★★★★★★★★★★★★★★★」sed"CHANGE: "CHANGE:

find ./ -type f -exec sed -i 's/abc/XYZ/gi' {} \;

모든 Python 파일을 찾아서 바꿉니다.

find ./ -iname "*.py" -type f -exec sed -i 's/abc/XYZ/gi' {} \;

URL을 "/" 문자로 바꿀 경우 주의하십시오.

그 방법의 예를 다음에 나타냅니다.

sed -i "s%http://domain.com%http://www.domain.com/folder/%g" "test.txt"

출처: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

작업 중인 파일이 그다지 크지 않고 일시적으로 변수에 저장하는 것이 문제가 되지 않는다면 파일 전체에 대해 한 번에 Bash 문자열 치환을 사용할 수 있습니다. 한 줄 한 줄 검토할 필요가 없습니다.

file_contents=$(</tmp/file.txt)
echo "${file_contents//abc/XYZ}" > /tmp/file.txt

줄 바꿈을 포함하여 파일 내용 전체가 하나의 긴 문자열로 취급됩니다.

는 XYZ와 같은 변수일 수 .$replacement여기서 sed를 사용하지 않는 것의 장점 중 하나는 검색 또는 치환 문자열에 sed 패턴 딜리미터 문자(통상은 /는 아니지만)가 포함되어 있을 수 있다는 것입니다.단점은 정규 표현이나 SED의 보다 정교한 조작을 사용할 수 없다는 것입니다.

를 사용할 수도 있습니다.ed파일 내 검색 및 치환 명령:

# delete all lines matching foobar 
ed -s test.txt <<< $'g/foobar/d\nw' 

자세한 내용은 "스크립트를 통한 파일 편집"을 참조하십시오.

파일의 텍스트를 대화식으로 편집하려면 vim과 같은 인플레이스 텍스트 편집기가 필요합니다.

다음으로 명령줄에서 사용하는 간단한 예를 제시하겠습니다.

vim -esnc '%s/foo/bar/g|:wq' file.txt

는 전 에디터의 @slim 답변과 기본적으로 동일합니다.

여기 몇 개 있다ex실제적인 예

텍스트 치환foo와 함께bar파일:

ex -s +%s/foo/bar/ge -cwq file.txt

여러 파일에 대한 후행 공백 제거:

ex +'bufdo!%s/\s\+$//e' -cxa *.txt

트러블 슈팅(단말기가 막혀 있는 경우):

  • 더하다-V1param: 상세 메시지를 표시합니다.
  • 강제 종료자:-cwq!.

다음 항목도 참조하십시오.

다음 셸 명령을 사용해 보십시오.

find ./  -type f -name "file*.txt" | xargs sed -i -e 's/abc/xyz/g'

bash 스크립트 내에서 python을 사용할 수도 있습니다.여기서 몇 가지 상위 답변은 그다지 성공적이지 못했으며, 이 답변은 루프 없이 작동한다는 것을 알게 되었습니다.

#!/bin/bash
python
filetosearch = '/home/ubuntu/ip_table.txt'
texttoreplace = 'tcp443'
texttoinsert = 'udp1194'

s = open(filetosearch).read()
s = s.replace(texttoreplace, texttoinsert)
f = open(filetosearch, 'w')
f.write(s)
f.close()
quit()

sed 명령어를 사용하여 파일 내의 여러 텍스트를 치환하는 가장 간단한 방법

명령어 -

sed -i 's#a/b/c#D/E#g;s#/x/y/z#D:/X#g;' 파일 이름

위의 명령어 s#a/b/c#D/E#g에서는 a/b/c를 D/E로 대체하고 그 후에 다시 같은 처리를 합니다.

rpl 명령어를 사용할 수 있습니다.예를 들어 전체 php 프로젝트에서 도메인 이름을 변경하려고 합니다.

rpl -ivRpd -x'.php' 'old.domain.name' 'new.domain.name' ./path_to_your_project_folder/  

명확한 원인은 알 수 없지만, 매우 빠르고 유용하게 사용됩니다.:)

코멘트를 읽지 않는 경우의 MAC 유저의 경우:)

@Austin에서 언급했듯이Invalid command code에러

임플레이스 교환의 경우BSD sed다음 파일 확장자가 필요합니다.-i지정된 확장자의 백업파일에 저장합니다.

sed -i '.bak' 's/find/replace' /file.txt

사용할 수 있습니다.''백업을 건너뛸 경우 빈 문자열을 선택합니다.

sed -i '' 's/find/replace' /file.txt

모든 메리트는 @Austin에게 있습니다.

vim 편집기를 사용하여 파일을 엽니다.명령어 모드

:%s/abc/xyz/g 

이게 제일 간단해

여러 파일을 함께 변경할 경우 다음과 같이 한 줄로 변경할 수 있습니다.

user_name='whoami'
for file in file1.txt file2.txt file3.txt; do sed -i -e 's/default_user/${user_name}/g' $file; done

도움이 될 수 있는 경우에 추가.

언급URL : https://stackoverflow.com/questions/525592/find-and-replace-inside-a-text-file-from-a-bash-command

반응형