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

우리 모두 알다시피 sed는 문자열을 찾고 바꾸는 데 매우 효율적입니다 (예 : “a”찾기). “b”: sed "s/a/b/g"로 바꿉니다.

sed?

sed 명령이없는 TV 용 잘린 Linux 시스템 용입니다. 따라서 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. 그 외에도 많은 도구와 언어가 일반 텍스트 문자열 대체를 수행 할 수 있습니다. 따라서 귀하의 질문은 다소 광범위합니다.
  • 왜? 해결하려는 문제는 무엇입니까?
  • TV 용 잘린 Linux 시스템은 sed 명령을 사용하지 않았습니다. 따라서 sed ' s / a / b / g ' 대신 다른 명령이나 스크립트를 사용해야합니다.

답변

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

이 샘플 데이터가 있다고 가정 해 보겠습니다. 파일 data.txt :

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

awk

$ 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

$ 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 

파일이 하위 셸로 리디렉션되면 삭제 된 다음 awk는 하위 셸 STDIN으로 읽혀진 파일의 내용에 대해 실행됩니다. 그런 다음이 내용은 awk에 의해 처리되고 동일한 파일 이름에 다시 기록됩니다. 방금 삭제하여 효과적으로 교체했습니다.

댓글

  • 답변 해 주셔서 감사하며 다음 근무일에 시도해 보겠습니다. ' sed '와 같은 일부 명령이 TV의 잘린 Linux 시스템에 존재하지 않을 수 있기 때문에 작동합니다. 명령 ' 찾기 ', ' grep ' 등을 사용하여 문제를 해결하세요.
  • @binghenzq-' 파일을 인라인으로 편집하는 예제를 추가했습니다.
  • -1 나는 거의 반대 투표를하지 않지만이 경우에는 질문은 더 / 동등하게 복잡하고 또한 의존적 일 가능성이있는 다른 방법보다는 더 간단한 방법 인 것처럼 보였습니다. 질문이 전체 * nix 시스템 설치에 대한 대안에 관한 것이면 아마도이 좋은 대답을 +1 할 것입니다.
  • @MichaelDurrant-방금 OP가 요청한 정교한 인라인 편집을 추가했습니다. . 또한 OP는 I가 아닌 sed를 사용하여 NOT 요구 사항을 설정했습니다. Sed는 이와 같은 대체 작업을 수행하는 데 적합한 도구이며 그는 '는 이러한 도구의 역할을 더 잘 이해하도록 요청하는 것이므로 누군가에게 이러한 일을 나쁘게 보여주는 것은 그 이유를 보여주는 데 매우 교육적인 것입니다. 너무 많이 알고있는 ppl은 단순히 "하지 마십시오 '하지 마십시오 " 이유를 설명하지 않고 서요. 하지만 DV 이유에 대해 최소한 의견을 남겨 주셔서 감사합니다.
  • 물론, 다른 모든면에서 좋은 대답이라고 생각했습니다. 네, 설명없이 -1을 싫어합니다.

답변

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

$ echo "foobar" | tr a b foobbr 

tr는 실제로 sedsed보다 낫습니다. > (perl 또는 awk는 고사하고) 단일 문자 대체는 썰매 망치를 사용하여 파리를 죽이는 것과 같습니다.

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

또는 일부 셸의 대체 기능 을 사용할 수 있습니다. 여기서 ksh, zsh 또는 bash 구문을 사용합니다.

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

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

댓글

  • ${foo//a/b}에서 대소 문자를 무시하는 옵션이 있습니까?
  • @ AlikElzin-kilaka I ' 안타깝습니다. 아니. ' 예 : echo "$foo" | sed 's/a/b/i와 같이 좀 더 정교한 것을 사용하거나 문자 클래스를 제공해야합니다. echo ${foo//[aA]/b}.

답변

POSIX 도구를 사용할 수 있습니다. ex :

ex a.txt <<eof %s/Sunday/Monday/g xit eof 

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html

댓글

  • 감사합니다. 추가하기 만하면 -c 플래그는 편집이 시작될 때 명령을 실행하는 것이고 (ex는 편집기이기 때문에) -s 플래그는 피드백을 비활성화하는 스크립트 모드이거나 일부는 slient-mode를 말합니다. 자세한 정보는 참조 : ex-vi.sourceforge.net/ex.html

답변

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

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

모든 * nix에서 사용할 수 있습니다. ",s/a/b/g"의 쉼표는 ed를 사용하여 모든 줄에서 작업 (vim에 익숙한 경우 더 친숙한 %도 사용할 수 있음) 및 나머지 그것의 표준 검색 및 교체입니다. w는 파일을 작성 (저장)하도록 지시하고 q는 종료하도록 지시합니다.

sed “의 -i 옵션 (및 다른 도구의 유사한 옵션)을 사용하면 실제로 임시 파일로 속이는 대신 파일을 제자리에서 편집합니다.

“이것이 스트림과 함께 작동하도록하는 것이 가능하지 않다고 생각합니다”하지만 저는 “ed에 대해 많이 알지 못합니다. 그리고 실제로 그 기능이 있다면 놀라지 않을 것입니다. (유닉스 철학은 그 자체입니다).

답변

조상 사용 명령 (-s는 조용함 (자동)을 의미하고 명령 앞의 쉼표는 모든 행에서 실행을 의미 함) :

인쇄 만 STDOUT :

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

제자리 교체 :

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

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다