sed 명령에 대해 알고 싶습니다
예를 들어 다음 명령이 있습니다.
rtNum=`pwd | sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'`
그리고
rtRun=`pwd | sed -e 's/^.*bbsp.\/rt.*\///'`
여기서 pwd는 다음과 같습니다. /tfsrun/bbsp2/rt3/run
생성되는 출력은 다음과 같습니다.
echo $rtNum
3
그리고
echo $rtRun
run
-e
위 sed 명령, 특히 위 sed 명령에서 /, // 및 ///의 사용 및 사용법을 이해하고 싶습니다.
답변1
매뉴얼에 명시된 대로 이 -e
옵션은 스크립트가 뒤따른다는 것을 나타냅니다. 스크립트는 정규식을 사용하여 일치하는 콘텐츠를 빈 문자열로 바꿉니다.
정규식을 이해하려면 다음을 읽는 데 충분한 시간을 할애하는 것이 좋습니다.https://www.tutorialspoint.com/unix/unix-regular-expressions.htm
귀하의 질문에 :
\/
슬래시가 이스케이프 처리되어 있습니까? 이는 구분 기호로 처리되지 않음을 의미합니다.
/
일치 문자열과 대상 문자열을 구분하는 구분 기호입니다.
예를 들어 's/matchingstring/targetstring/'
s 호출은 일치하는 문자열의 첫 번째 항목을 대상 문자열로 바꿉니다.
귀하의 경우:
'//'
구분 기호 사이에 아무것도 없기 때문에 대상 문자열이 비어 있음을 나타냅니다.'///'
실제로 그렇습니다.'\///'
이는 일치 문자열이 슬래시로 끝나고 대상 문자열이 비어 있음을 의미합니다.
답변2
-e
to 플래그는 sed
"이것을 실행/실행"하는 방법입니다. sed
동일한 호출에서 여러 편집 명령을 실행 하려면 이 명령이 필요합니다 sed
( 로 구분하지 않는 한 ).;
예를 들어, 파일에서 1행과 20~30행만 추출/인쇄하려면(이 -n
플래그는 각 입력 행의 기본 출력을 끕니다):
$ sed -n -e '1p' -e '20,30p'
에서는 sed
단일 슬래시( )를 사용하여 정규식을 구분합니다./
예를 들어, 같은 줄에서 "hello" 문자열 뒤에 "word"가 오는 모든 줄을 삭제합니다.
$ sed '/hello.*world/d'
때로는 대체 항목에 이중 슬래시가 표시될 수 있습니다. 명령 실행은 정규식과 일치하는 콘텐츠를 문자열로 s
바꿉니다 .sed
s/pattern/replacement/
의도라면삭제패턴과 일치하는 것, 교체는 비어 있을 것이고 우리는 다음과 같이 끝날 것입니다.
s/pattern//
삼중 슬래시( ///
)는 패턴을 제거하려는 누군가에게서 나온 것입니다.슬래시로 끝나다. 슬래시는 구분 기호로 사용되므로 첫 번째 슬래시는 다음과 같습니다.탈출하다백슬래시( )로 \/
구성됩니다 \///
. "이스케이프 처리됨"은 "구분 기호가 아닌 문자 그대로의 문자로 처리됨"을 의미합니다.
대체 작업을 수행할 때 어색한 슬래시 문제를 해결하는 방법에는 여러 가지가 있습니다 sed
. 대안을 택하다
s/\///
/
이렇게 하면 각 행의 첫 번째 행이 제거됩니다(실제로는비어있는 것으로 교체).
또 다른 방법은 글쓰기이다.
s/[/]//
슬래시를 문자 그룹에 넣거나대괄호 표현. 이러한 그룹의 모든 문자는 항상 리터럴 문자로 처리됩니다 sed
. 대괄호 표현식만 일치합니다.하나문자는 거기에 나열된 문자를 초과합니다.
또 다른 방법은 다른 구분 기호를 사용하는 것입니다.
s#/##
여기서 #
문자는 구분 기호 역할을 합니다(모든 문자를 선택할 수 있음). #
구분 기호로 사용될 때 a를 일치시키 려면 기본 구분 기호를 사용할 때와 마찬가지로 또는 중 하나를 #
사용해야 합니다.\#
[#]
/
그럼 sed
명령줄을 확인해 보세요.
sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'
이렇게 하면 두 가지 편집 작업이 수행됩니다.
s/^.*bbsp.\/rt//
또는s#^.*bbsp./rt##
s/\/.*$//
또는s#/.*$##
둘 다 교체( s
의 편집 명령 sed
)이며 둘 다 일치하는 패턴을 아무것도 바꾸지 않습니다. 즉, 둘 다 입력에서 무언가를 제거합니다.
첫 번째 패턴은 ^.*bbsp.\/rt
줄의 시작 부분( ^
)에서 시작하여 임의 개수의 문자( .*
), 문자열 bbsp
, 기타 문자( .
) 및 문자열이 뒤따르는 것과 일치합니다 /rt
.
따라서 모든 문자를 나타내는 after /rt
를 포함하여 해당 줄의 모든 내용을 삭제하는 것처럼 보입니다 .bbsp.
.
두 번째 패턴은 a부터 줄 끝까지( )까지 일치 \/.*$
합니다 ./
$
그래서 한 줄의 텍스트가 주어졌습니다.
/tfsrun/bbsp2/rt3/run
첫 번째 대체는 다음과 같이 바뀔 것입니다.
3/run
두 번째는 그것을 다음과 같이 바꿀 것입니다.
3
답변3
여기 당신의 견적이 있습니다man sed
-e 스크립트, --expression=스크립트
add the script to the commands to be executed
s/정규식/교체/
Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement. The replacement may contain the special character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp.