Bash를 사용하여 파일에서 절대 경로 제거

Bash를 사용하여 파일에서 절대 경로 제거

다른 파일에 대한 절대 경로가 포함된 "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

sedGNU와 큰따옴표를 사용하여 변수를 확장할 수 있습니다.

sed -i.bak "\:^${path}$:d" list.txt
  • -i여기서는 그림과 같이 일치하는 패턴을 내부 교체/제거하는 작업을 수행했으며 $path원본 파일은 .bak다음을 사용하여 백업되었습니다.list.txtlist.txt.bak
  • sed우리는 will contain에 슬래시가 포함된 오류를 방지하기 위해 다양한 구분 기호를 사용합니다 ./$path
  • 부분 일치 대신 전체 줄 경로를 일치시키기 위해 줄 시작 ^및 줄 끝 앵커를 사용합니다.$
  • 구분 기호가 슬래시가 아닌 경우 필수이므로 첫 번째 구분 기호를 여는 것을 피했습니다 /. man sed파일에 기록합니다 .

    \cregexpc
        Match lines matching the regular expression regexp.
        The c may be any character.
    

    이것은 실제로 sed다음 캐릭터가 우리의 것임을 나타냅니다.구분 기호.

관련 정보