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

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

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

대신 다른 명령이나 쉘 스크립트를 사용할 수 있습니까 sed?

이 명령이 없는 TV용 Linux의 잘린 버전입니다 sed. 그래서 대신 다른 명령이나 스크립트를 사용해야 합니다.sed 's/a/b/g'. –

답변1

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

$ echo "foobar" | tr a b   
foobbr

trsed( 또는 sed은 물론 이고 )을 사용하여 단일 문자 대체를 수행하는 것은 큰 망치로 파리를 죽이는 것과 같기 때문에 실제로 그보다 낫습니다 .perlawk

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

또는 다음을 사용할 수 있습니다.대체능력일부 껍질. 여기서는 or 구문이 사용됩니다 ksh.zshbash

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

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

답변2

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

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

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

$ 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

파일이 서브셸로 리디렉션되면 해당 파일은 삭제된 다음 awk서브셸의 STDIN으로 읽혀진 파일 내용에 대해 실행됩니다. 그러면 해당 콘텐츠가 처리되어 awk방금 삭제한 동일한 파일 이름에 다시 기록되어 효과적으로 대체됩니다.

답변3

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

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

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

답변4

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

방금 인쇄됨표준 출력:

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

내부 교체:

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

관련 정보