sed 명령에서 /를 올바르게 이스케이프 처리함

sed 명령에서 /를 올바르게 이스케이프 처리함

$foo첫 번째 위치 매개변수를 사용하고 에서 해당 줄 앞의 모든 줄을 삭제하는 스크립트를 만들려고 합니다 . 하지만 계속해서 다음과 같은 오류가 발생합니다. 내 의견은 탈출을 시도했지만 도움이 되지 않았다는 것입니다. 또한 텍스트를 이스케이프 처리하는 다양한 방법을 찾아보았지만 소용이 없었습니다. 내 코드는 다음과 같습니다$foofiles.txtsed: -e expression #1, char 22: unknown command: frecup_dir.6/f5681240.mpg/recup_dir.6\/f5681240.mpg

foo=$1;
sed -i "0,/^file $foo$/d" files.txt

편집: 질문을 더 명확하게 하기 위해 다음과 같은 파일이 있다고 가정해 보겠습니다.files.txt

file ab/c
file eg/f
file hi/j
file xy/z

이제 특정 요소 앞에 있는 모든 요소를 ​​제거하고 싶기 때문에 hij잘 작동하는 명령을 사용합니다.sed -i '0,/^file hi\/j$/d' files.txt

그러나 위에 표시된 스크립트의 일부로 사용하려고 하면 실패합니다. ./script.sh eg\/f오류로 인해 실행이 실패합니다.sed: -e expression #1, char 23: unknown command: `f'

감사해요

답변1

문제는 문자열에 슬래시 문자가 포함되어 있다는 것입니다. 이 문자는 쉘이 sed표현식에 삽입할 때 구문 오류를 생성합니다(정규 표현식이 조기에 종료됨).

이를 해결하는 한 가지 방법은 삽입하는 문자열처럼 모든 /문자가 이스케이프되도록 하는 것이지만 이는 약간 어색합니다. \/또 다른 방법은 문자열에 없는 구분 기호를 사용하는 것입니다.

foo=$1
sed -i "1,\:^file $foo$:d" files.txt

구분 기호가 처음 나타나는 경우 표현식에서 이스케이프해야 하며 이는 0일반적으로 범위의 유효한 시작이 아닙니다.

일치하는 행도 출력하려면 다음을 수행하십시오.

foo=$1
sed -i "1,\:^file $foo$: { \:^file $foo$: p; d; }" files.txt

대체 솔루션:

awk -v file="$foo" 'output; $0 == "file " file { output = 1 }' files.txt

output변수가 0이 아니거나 공백이 아닌 경우 각 행이 출력됩니다. 명령줄에 변수를 제공하는 문자열이 1줄 뒤에 올 때마다 해당 변수는 로 설정됩니다 .filefile

일치하는 행도 출력하려면 다음을 수행하십시오.

awk -v file="$foo" '$0 == "file " file { output = 1 }; output' files.txt

관련 정보