우리 모두 알고 있듯이 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
tr
sed
( 또는 sed
은 물론 이고 )을 사용하여 단일 문자 대체를 수행하는 것은 큰 망치로 파리를 죽이는 것과 같기 때문에 실제로 그보다 낫습니다 .perl
awk
grep
이를 위해 설계되지 않았으며 입력을 수정하지 않고 검색만 합니다.
또는 다음을 사용할 수 있습니다.대체능력일부 껍질. 여기서는 or 구문이 사용됩니다 ksh
.zsh
bash
$ 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
!