다른 파일에 대한 절대 경로가 포함된 "list.txt" 파일이 있습니다.
/home/lin/bash/aaa
/home/lin/bash/song.mp3
/home/lin/bash/doc.html
/home/lin/bash/directory
변수에 경로를 할당하고 싶습니다
path="/home/lin/bash/song.mp3"
그런 다음 해당 경로의 전체 줄을 삭제합니다. 나는 노력했다
sed -i '$path' list.txt
그리고 다른 많은 명령은 grep, echo이지만 아무것도 작동하지 않습니다.
답변1
노력하다grep
다시 닫으면 작동합니다.
grep -xv "$path" list.txt > tmp_$$ && mv tmp_$$ list.txt
최종 list.txt
콘텐츠:
/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
답변2
솔루션에는 두 가지 문제가 있습니다. 첫째, 표현식을 표현하기 위해 작은따옴표를 사용하기 때문에 '$path'
변수처럼 처리되지 않고 문자 그대로 처리됩니다 $path
. 이 문제를 해결하려면 큰따옴표를 사용하세요 "$path"
. 그러나 두 번째 문제에 직면하게 됩니다. 슬래시를 /
특수 기호로 사용하려고 하는데 sed
동시에 이 기호가 경로에 나타나서 혼란스러워집니다 sed
. 따라서 슬래시 대신 다른 기호를 사용해야 합니다. 예를 들어 쉼표를 사용하세요.
$ sed -i "s,${path},," list.txt
$ cat list.txt
/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
Tim Kennedy는 빈 줄을 남기지 않는 또 다른 멋진 접근 방식을 고안했습니다(작동 방식에 대한 설명은 아래 설명 참조).
$ sed -i "\,${path},d" list.txt
$ cat list.txt
/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
답변3
sed
GNU와 큰따옴표를 사용하여 변수를 확장할 수 있습니다.
sed -i.bak "\:^${path}$:d" list.txt
-i
여기서는 그림과 같이 일치하는 패턴을 내부 교체/제거하는 작업을 수행했으며$path
원본 파일은.bak
다음을 사용하여 백업되었습니다.list.txt
list.txt.bak
sed
우리는 will contain에 슬래시가 포함된 오류를 방지하기 위해 다양한 구분 기호를 사용합니다 ./
$path
- 부분 일치 대신 전체 줄 경로를 일치시키기 위해 줄 시작
^
및 줄 끝 앵커를 사용합니다.$
구분 기호가 슬래시가 아닌 경우 필수이므로 첫 번째 구분 기호를 여는 것을 피했습니다
/
.man sed
파일에 기록합니다 .\cregexpc Match lines matching the regular expression regexp. The c may be any character.
이것은 실제로
sed
다음 캐릭터가 우리의 것임을 나타냅니다.구분 기호.