$foo
첫 번째 위치 매개변수를 사용하고 에서 해당 줄 앞의 모든 줄을 삭제하는 스크립트를 만들려고 합니다 . 하지만 계속해서 다음과 같은 오류가 발생합니다. 내 의견은 탈출을 시도했지만 도움이 되지 않았다는 것입니다. 또한 텍스트를 이스케이프 처리하는 다양한 방법을 찾아보았지만 소용이 없었습니다. 내 코드는 다음과 같습니다$foo
files.txt
sed: -e expression #1, char 22: unknown command: f
recup_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
줄 뒤에 올 때마다 해당 변수는 로 설정됩니다 .file
file
일치하는 행도 출력하려면 다음을 수행하십시오.
awk -v file="$foo" '$0 == "file " file { output = 1 }; output' files.txt