sed를 사용하여 파일에서 어떻게 사용할 수 있습니까?

sed를 사용하여 파일에서 어떻게 사용할 수 있습니까?

날짜(1990년 20월 1일)의 "/"를 "."으로 바꾸는 방법을 찾으려고 합니다. 전체 파일이 이라는 것을 이해 's/\//./g'하지만 파일에 URL이 있으므로 해당 '/'를 '.'로 대체합니다. 이는 필요한 것이 아닙니다. 특정 열에만 적용되게 하는 방법이 있나요? Perl을 사용하여 이 작업을 수행할 수 있는 방법이 있다고 말했지만 저는 bash에서 작업하고 있습니다.

답변1

귀하의 줄에 속하지 않는 다른 구분 기호를 사용하십시오.

echo 'http://www.google.com  (20/01/1990)' | sed -r 's@([0-9]+)/([0-9]+)/([0-9]+)@\1.\2.\3@g'
http://www.google.com  (20.01.1990)

답변2

bash이는 쉘, 명령줄 해석기입니다. 그것이 하는 일은 명령을 실행하는 것입니다. 그리고 sed다른 쉘에서 실행할 수 있는 perl두 가지 명령이 있습니다.bash

둘 다 일부 프로그래밍 언어의 통역사이지만 여기서는 관련이 없습니다. 둘 다 텍스트 처리에 능숙합니다. 왜냐하면 텍스트 처리를 위해 설계된 것이기 때문입니다. sed표준 명령이지만 POSIX에서 지정한 범위를 벗어나는 경우 호환되지 않는 다양한 구현이 있지만 perl구현은 하나뿐입니다(기능 수준이 다른 여러 버전이 있음에도 불구하고).

여기에서 표준 sed구문을 사용하여 다음을 수행할 수 있습니다.

sed 's|\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)|\1.\2.\3|g'

구현에 관계없이 sedPOSIX에서 지정한 제한 내에서 POSIX 표준을 준수하는 한(이 경우 입력이 유효한 텍스트이고 실제로 매우 긴 줄, 유효하지 않은 바이트 시퀀스를 포함하지 않는 한) 문자 또는 구분자가 아닌 문자), 일부 구현(예: GNU)에서는 sed이를 확장으로 허용할 수 있지만 모두 작동해야 합니다.

모든 버전 perl과 입력에 대해 다음과 같이 작성할 수도 있습니다.

perl -pe 's|(\d\d)/(\d\d)/(\d{4})|$1.$2.$3|g'

또는 최신 버전을 사용하거나 다음을 수행하십시오 perl.

perl -pe 's{\d\d/\d\d/\d{4}}{$&=~y|/|.|r}ge'

1000/10/99999로 바꾸는 것을 피하려면 표준에서는 사용할 수 있지만 표준에서는 1000.10.99999사용할 수 없는 단어 경계 연산자를 사용할 수 있습니다 (일부 구현에서는 / 또는 /를 확장으로 지원하지만).perlsed\<\>[[:<:]][[:>:]]

perl -pe 's|\b(\d\d)/(\d\d)/(\d{4})\b|$1.$2.$3|g'

또는주위를 둘러보세요연산자(정규식의 기능이기도 perl하지만 표준 sed 정규식은 아님)

perl -pe 's|(?<!\d)(\d\d)/(\d\d)/(\d{4})(?!\d)|$1.$2.$3|g'

표준과 동등한 sed작업을 수행할 수 있습니다.프로그램 작성( sed조건부 루프 구조):

sed -e :1 -e 's|^\(.*[^[:digit:]]\)\{0,1\}\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)\([^[:digit:]].*\)\{0,1\}$|\1\2.\3.\4\5|g; t1'

관련 정보