2014-12-29 2 views
1

나는 쉘 스크립트에서 매우 새로운 단어이므로 시작하지 마십시오! :) regex 캡처 그룹을 사용하여 sed를 사용하여 파일의 문자열을 바꿉니다.

나는 다음과 같은 텍스트가 포함 된 파일이 있습니다

1 : /
2 : /string-1/ 
4 : /string-2/ 
5 : /string-3/ 

을 나는 결과가 그렇게해야하므로 문자열의 마지막 슬래시를 제거하려면 :

1 : /
2 : string-1 
4 : string-2 
5 : string-3 

I 다음과 같이 sed을 사용하여 시도해보십시오.

local_export_folder="/home/merianos/Documents/repositories/DatabaseBackup/tmp" 

sed -i -e 's/\/([^\/]+)\//\1/' ${local_export_folder}/blogs.csv 

그러나 이것은 작동하지 않습니다.

뭐가 잘못 되었나요?

+0

귀하의 제목이 오해의 소지가, 여기에는 '정규 표현식 변수가'없다. '이것이 효과가 없다'는 것보다 구체적 일 수 있습니까? –

+0

제목을 설명하려고하면 대체 텍스트로 괄호의 내용을 사용하는 방법이 있습니다. 그 제목을 더 잘 쓰는 법을 모르겠습니다. –

+1

괄호 사이의 부분을 _capture group_이라고합니다. 희망이 도움이됩니다. –

답변

3

이 나를 위해 작동합니다

sed 's#/\([^/]*\)/#\1#' file 

이 두 앞으로 사이에 어떤 내용이 슬래시 캡처합니다. 대체 콘텐츠는 슬래시가없는 콘텐츠입니다.

한 가지 문제점은 sed의 모든 버전에서 + (하나 이상)을 인식하지 못한다는 것입니다. 나는 * (0 또는 그 이상을 의미 함)으로 변경했으며, 이는 더 널리 인정됩니다. 원하는 경우 POSIX 호환 \{1,\}을 사용하여 또는 중 하나 이상을 대신 사용할 수 있습니다.

출력 :

$ sed 's#/\([^/]*\)/#\1#' file 
1 : /
2 : string-1 
4 : string-2 
5 : string-3 

SED의 버전에 따라 확장 된 정규 표현식을 사용하려면 -r 또는 -E 스위치를 사용할 수 있습니다. 이 괄호 캡처 그룹으로 사용되는 이스케이프 필요가 없다는 것을 의미하고 + 이해된다

sed -r 's#/([^/]+)/#\1#' file 
+0

고마워, 내 정규 표현식을 사용하는 동안 마침내 네가 나를 도왔다. 왜냐하면 네가 캡쳐 그룹 괄호를 벗어나는 것을 볼 수 있기 때문이다. 그래서, 내가 도망 칠 때 괄호가 나를 위해 일했습니다. –

+1

그리고 이것이 도움이 될 경우 입력을 파괴적으로 변경하려면 다음을 사용하십시오 : sed -i 's #/\ ([^ /] * \)/# \ 1 #'파일 – unigeek

+1

@Merianos 그 (것)들을 도주 할 필요없이 괄호. –

관련 문제