sed는 정확한 패턴으로 줄을 삭제합니다.

sed는 정확한 패턴으로 줄을 삭제합니다.

$i파일 에서 정확히 일치하는 패턴을 찾고 C1.txtsed 명령을 사용하여 일치하는 줄을 제거하려고 합니다. 하지만 결국 문제에 부딪혔습니다. 아래에서 내가 찾은 결과와 추가 세부정보를 찾아보세요.

C1.txt

# file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::---
# file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- 

변하기 쉬운

i=/home/mytest/data 

암호

#!/bin/bash
Input=C1.txt
  j=0
      while IFS= read -r line;
      do
      j=$((j+1))
        Exists=$(echo $line | grep -iwoP "$i" )
        if [[ ! -z "$Exists" ]]; then
        sed -i "$j /\b"$i"\b/d" "$Input"
        fi
      done <"$Input"

예상되는 결과

C1.txt

# file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::---

에러 메시지

sed: -e expression #1, char 3: unknown command: `/'

답변1

오류가 발생하는 이유는 검색 문자열에 /마커 문자와 혼동되는 문자가 포함되어 있기 때문입니다. 즉, sed다음과 같이 요청합니다.

sed "//home/mytest/datasr123/d"

이로 인해 표시되는 오류가 발생합니다. IOW, 패턴에는 마커로 사용하는 문자가 포함될 수 없습니다. 당신의 패턴이 그렇다는 것을 안다면아니요특정 문자를 포함합니다. 해당 문자를 마커로 사용할 수 있습니다. 예를 들어 해당 문자가 검색 문자열에 없기 때문에 ;다음을 수행할 수 있습니다.

sed "\;/home/mytest/datasr123;d"

또는 다음과 같은 측면에서 $i:

sed "\;$i;d"

주소를 지정하는 방법에 대한 자세한 내용은 sed아래 매뉴얼 페이지를 참조하십시오.Addresses

물론 이것이 유용한지 여부는 검색 문자열에 절대 나타나지 않는 문자를 알고 있는지 여부에 따라 달라집니다. 모든 문자를 마커로 사용할 수 있지만 사용자가 검색 문자열을 입력한 경우 검색 문자열이 무엇인지 보장할 수 없습니다. 입력이 맞습니다. select는 검색 문자열에 나타나지 않습니다. 검색 문자열에 나타나지 않는 문자를 찾으려면 검색해야 합니다.

가장 간단한 방법은아니요완전히 작동 sed하지만 grep에 의존합니다(내 어리석은 실수를 고쳐준 @Kusalananda에게 감사드립니다):

grep -v -F -e "$i" -- <file>

패턴과 일치하지 않는 줄만 표시합니다(예 -v: -Fgrep에게 정규 표현식이 아닌 문자열을 문자 그대로 해석하도록 지시합니다. 예를 들어 *문자 .그대로 일치합니다. -e패턴이 a로 시작 -하고 옵션으로 해석되지 않도록 허용 합니다 grep.--파일 이름a로 시작 -하고 다음으로 해석되지 않는 grep옵션은 다음과 같습니다.언제나grep대화형으로 호출할 때는 대부분 문제가 없지만 이러한 상황이 언제 발생할지 모르기 때문에 스크립트 내에서 호출하는 것이 더 좋습니다 .grep

하지만 참고하세요: 질문이 편집되었으며 스키마 변경 사항은 적용되지 않습니다.모든이 답변의 방법이 완료되었습니다. 패턴 매칭둘 다행이 입력되므로 모두 삭제됩니다. "$i"두 가지 모두와 일치하는 not for를 찾는 등 패턴을 어떻게든 재해석해야 합니다 . 대신 "${i} "첫 번째 줄은 일치하지만 두 번째 줄은 일치하지 않는 추가 공백을 찾거나 "${i}s"두 번째 줄과 일치하지 않습니다. 첫 번째 줄. 또한 를 사용할 때는 -F문자 클래스를 사용할 수 없으므로 \b더 이상 사용되지 않습니다.

답변2

원문에는 grep -iwoP"정확한 일치"라는 개념이 반영되지 않은 것 같지만...

^검색 문자열과 정확히 일치하는 전체 줄을 제거하려면 줄의 시작과 끝 부분에 고정 해야 합니다 .$

sed "\|^$i$|d" C1.txt

관련 정보