Sed 명령을 사용하지 않고 문자열을 찾아 바꾸는 방법은 무엇입니까?


16

우리 모두 알고 있듯이 sed문자열을 찾아서 바꾸는 것이 매우 효율적입니다. 예를 들어 'a'를 찾은 다음 'b':로 바꾸십시오 sed 's/a/b/g'.

대신 다른 명령이나 셸 스크립트 로이 작업을 수행 할 수 sed있습니까?

sed명령 이없는 TV 용 잘린 리눅스 시스템 용 입니다. 따라서 대신 다른 명령이나 스크립트를 사용해야합니다sed 's/a/b/g'. –


실제로, 그것은 정규 표현식 기반 대체 일뿐입니다. 이러한 일을 처리 할 수있는 모든 도구 나 언어는 동일한 기능을 수행 할 수있을 것이지만 다양한 구문 : $var=~s/a/b/g, gsub(/a/,"b",var), var.gsub(/a/,'b'), var.replace(/a/g,'b'), preg_replace("/a/","b",$var), regsub -all a b $var. 그 외에도 많은 도구와 언어가 일반 텍스트 문자열을 대체 할 수도 있습니다. 그래서 당신의 질문은 어떻게 든 광범위합니다.
manatwork

1
왜? 어떤 문제를 해결하려고합니까?
Gilles 'SO- 악마 그만

잘려진 TV 용 리눅스 시스템은 명령을 내리지 않았습니다. 따라서 sed 's / a / b / g'대신 다른 명령이나 스크립트를 사용해야합니다.
binghenzq

답변:


12

예,이 작업을 수행하는 다양한 방법이 있습니다. 당신은 사용할 수 있습니다 awk, perl또는 bash아니라 이러한 활동을 할 수 있습니다. 일반적으로 sed이러한 유형의 작업을 수행하는 데 가장 적합한 도구 일 것입니다.

이 샘플 데이터가 파일에 있다고 가정 해보십시오 data.txt.

foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50

어 wk

$ awk '{gsub("foo", "foofoofoo", $0); print}' data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

$ perl -pe "s/foo/foofoofoo/g" data.txt 
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50

인라인 편집

위의 예제는 파일을 직접 수정할 수도 있습니다. Perl 예제는 사소한 것입니다. -i스위치를 추가하기 만하면 됩니다.

$ perl -pie "s/foo/foofoofoo/g" data.txt 

들어 awk그것을 덜 직접적인하지만 단지 효과로 약간의 :

$ { rm data.txt && awk '{gsub("foo", "foofoofoo", $0); print}' > data.txt; } < data.txt

이 메소드는 중괄호 '{...}`로 서브 쉘을 작성합니다. 여기서 파일은 다음을 통해 파일로 경로 재 지정됩니다.

$ { ... } < data.txt

파일이 서브 쉘로 경로 재 지정되면 파일이 h 제된 후 awk서브 쉘 STDIN으로 읽은 파일의 내용에 대해 실행 됩니다 . 그런 다음이 내용은 awk방금 삭제 한 것과 동일한 파일 이름으로 처리되고 다시 쓰여져 효과적으로 대체됩니다.


답변 해 주셔서 감사합니다. 다음 근무일에 시도해 볼 것입니다.하지만 일부 명령이 'sed'와 같은 TV의 잘린 Linux 시스템에 없을 수 있기 때문에 작동하는지 확실하지 않습니다. 그래서 여전히 'find'명령을 사용하고 싶습니다. , 'grep'등으로 해결하십시오.
binghenzq

@binghenzq-파일을 인라인 편집하는 예제를 추가했습니다.
slm

-1 나는 거의 공감하지 않지만이 경우 문제의 요점은 다른 더 / 똑같이 복잡하고 아마도 의존적 ​​인 것보다 간단한 방법 인 것처럼 보였다. 질문이 전체 * nix 머신 설치의 대안에 관한 것이라면 아마도이 대답을 +1 할 것입니다.
Michael Durrant

@MichaelDurrant-방금 OP가 요청한 정교한 인라인 편집을 추가했습니다. 또한 영업 이익의 요구 사항을 설정 하지 사용 sed하지 I. Sed의는 이와 같은 대체 작업을 수행하기위한 적절한 도구를, 그는 분명히 더 나은 그래서 누군가에게 나쁜 생각이 일을 보여, 이러한 도구의 역할을 이해 묻는 데요, 보여주는 매우 교육이다 그들 왜. 알고있는 ppl이 너무 많은 경우, 이유를 설명하지 않고 단순히 "하지 마십시오"라고 말합니다. 하지만 왜 DV에 대한 의견을 남겨 주셔서 감사합니다.
slm

물론, 나는 그것이 다른 모든면에서 큰 해답이라고 생각했습니다. 그래, 난 설명없이 -1 싫어.
Michael Durrant

13

단일 문자 대체에 대한 고전적인 대안은 tr거의 모든 시스템에서 사용할 수 있는 명령입니다.

$ echo "foobar" | tr a b   
foobbr

tr단일 문자 대체를 위해 (단독 또는 )를 사용하는 것은 썰매 망치를 사용하여 파리를 죽이는 것과 같기 sed때문에 실제로 이것 보다 낫습니다 .sedperlawk

grep 이를 위해 설계되지 않았으며 입력을 수정하지 않고 입력 만 검색합니다.

또는 일부 쉘 의 대체 기능 을 사용할 수 있습니다 . 여기 kshzsh또는 bash구문을 사용하십시오.

$ foo="foobar"
$ echo "${foo//a/b}"
foobbr

해결하려는 문제를 정확히 설명하면 더 구체적인 답변을 드릴 수 있습니다.


에서 대소 문자를 무시할 수있는 옵션이 ${foo//a/b}있습니까?
AlikElzin-kilaka

@ AlikElzin-kilaka 나는 두렵지 않다. 예를 들어 다음과 같이보다 정교한 것을 사용해야 echo "$foo" | sed 's/a/b/i하거나 캐릭터 클래스를 제공해야합니다 echo ${foo//[aA]/b}.
terdon

4

Ex 모드에서 Vim을 사용할 수 있습니다 :

ex -s -c '%s/a/b/g|x' file
  1. % 모든 줄을 선택하십시오

  2. s 대용품

  3. g 글로벌 교체

  4. x 저장하고 닫습니다


큰 감사합니다. 추가하기 위해 -c 플래그는 편집이 시작될 때 (ex는 편집기이므로) 명령을 실행하는 것이고 -s 플래그는 피드백을 비활성화하는 스크립트 모드이거나 slient-mode와 같습니다. 자세한 정보는 ref : ex-vi.sourceforge.net/ex.html
Jimmy MG Lim

3

스트림이 아닌 파일로 작업하는 경우 표준 텍스트 편집기를 사용할 수 있습니다 ed.

printf '%s\n' ',s/a/b/g' w q | ed file.txt

* nix에서 사용할 수 있습니다. 쉼표는 모든 라인 에서 작동하도록 ',s/a/b/g'지시 ed합니다 (을 사용하면 vim에 익숙 할 경우 더 익숙 할 것입니다). 그리고 나머지는 표준 검색 및 바꾸기입니다. 파일 쓰기 (저장)를 지시하고 종료하도록 지시합니다.%wq

sed의 -i옵션 (및 다른 도구의 유사한 옵션)과 달리 이것은 실제로 임시 파일을 부정하지 않고 대신 파일을 편집합니다.

나는 이것을 스트림과 함께 사용할 수 있다고 생각하지 않지만 실제로는 많이 알지 ed못하고 실제로 그 능력 (유닉스 철학이 무엇인지)이 있다면 놀라지 않을 것입니다.


2

조상 명령 사용 ( -s즉, 자동 (자동) 을 의미하고 명령 앞에 쉼표가 있으면 모든 행에서 실행 됨) :

STDOUT에 인쇄 중입니다 .

ed -s file <<!
,s/a/b/g
,p
q
!

전체 교체 :

ed -s file <<!
,s/a/b/g
w
q
!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.