터미널 만 사용하여 프로그래밍 방식으로 파일을 편집하는 방법은 무엇입니까?


13

명령에서 파일을 읽고 수동 개입없이 파일을 편집 할 수있는 쉘 스크립트를 작성하려고합니다 (일부 텍스트를 검색하고 다른 텍스트로 대체).

나는 이것을 위해 텍스트 편집기를 사용할 필요가 없습니다 .... grep 사용과 같은 간단한 텍스트 검색 후 다른 텍스트로 바꾸고 변경 사항을 저장하십시오 ...

답변:


10

그 곳 sed에서 게임이 시작됩니다. sed명령이 형식은 :

[pattern1][,pattern2][!] command [args]

정규식을 사용하므로 조금 어려울 수 있습니다. 아래의 두 번째 링크에서 가져온 몇 가지 기본 예 :

# 각 줄에서 "foo"를 "bar"로 대체 (찾기 및 바꾸기)
sed 's / foo / bar /'# 줄에서 첫 번째 인스턴스 만 교체
sed 's / foo / bar / 4'# 줄에서 4 번째 인스턴스 만 교체
sed 's / foo / bar / g'# 라인의 모든 인스턴스를 대체합니다
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /'# 다음에 나오는 마지막 대소 문자를 바꿉니다.
sed 's / \ (. * \) foo / \ 1bar /'# 마지막 경우 만 교체

# "baz"를 포함하는 줄에 대해서만 "foo"를 "bar"로 대체
sed '/ baz / s / foo / bar / g'

# "baz"를 포함하는 줄을 제외하고 "foo"를 "bar"로 대체
sed '/ baz /! s / foo / bar / g'

# "scarlet"또는 "ruby"또는 "puce"를 "red"로 변경
sed 's / scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g'# 대부분의 seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g'# GNU sed 만 해당

일부 참조


7

매우 늦은 답변. 그러나 이것은 비슷한 문제 / 질문을 가진 다른 사람들을 도울 수 있습니다.

패치를 만들어 적용하는 것이 좋습니다. 여기서 좋은 예를 찾을 수 있습니다 .

예를 들어 new.txt 파일에 old.txt에 적용 할 변경 사항이 포함되어 있다고 가정합니다. 터미널에서 또는 patch_file.sh를 작성하고 실행하여 명령을 실행할 수 있습니다.

명령 행 : 터미널을 열고 아래 행을 복사하여 실행하십시오 (필요한 경우 파일 이름 변경).

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

스크립트 : .sh 파일 접근 방식을 사용합니다. 터미널에서 (키보드 : ctrl + alt + t : gedit patch_file.sh

아래와 같이 터미널에서 실행되는 명령을 .sh 파일과 헤더 아래에 복사하여 붙여 넣습니다 (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

스크립트를 실행 가능하게 만듭니다 (터미널).

chmod +x patch_file.sh

스크립트 (터미널)를 실행하십시오.

./patch_file.sh # may require sudo access depending on the directory affected

+1 패치는 중간에서 무겁거나 복잡한 수정에 항상 올바른 방법입니다. 왜 일부는 정규식 도구를 사용하여 모든 일을하려고하는지 모르겠습니다.
user.dz 2016 년

테스트 할 파일에 원하는 변경 사항을 적용하는 것처럼 보이는 정규식을 리버스 엔지니어링하는 것보다 +1이 훨씬 좋습니다 ...하지만 해당 파일의 다른 인스턴스에 적용될 때 때로는 다른 효과가 있습니다.
bigjosh

특정 텍스트 문자열의 모든 인스턴스를 바꾸려면 패치가 의미가 있습니까? 즉, 모든 ""를 "_"로, 모든 "빼기"를 "-"로, 모든 "gb | <string_of_numbers> | ARO :"를 " ARO : "? 감사.
Josh

1

파일을 편집하려면 파일 편집기를 사용하십시오 . ex 또는 ed 와 같은 스크립트에서 사용할 수있는 명령 기반 파일 편집기가 있습니다 .


1

당신은 sed 또는 awk를 찾고 있습니다. 나는 sed가 더 간단하고 더 강력하다는 것을 알았습니다.

다음은 다른 질문 의 예입니다 .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

이것은 다음을 의미합니다.

  • 파일에서 검색 /usr/share/applications/defaults.list
  • 찾기 / 그립 gedit.desktop
  • 로 교체 yournew.desktop
  • 변경 사항을 적용하십시오 -i

0

당신이 잘 알고 있다면, 편집에 필요에 따라 vi다음 ed유용 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.