$i
파일 에서 정확히 일치하는 패턴을 찾고 C1.txt
sed 명령을 사용하여 일치하는 줄을 제거하려고 합니다. 하지만 결국 문제에 부딪혔습니다. 아래에서 내가 찾은 결과와 추가 세부정보를 찾아보세요.
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
: -F
grep에게 정규 표현식이 아닌 문자열을 문자 그대로 해석하도록 지시합니다. 예를 들어 *
문자 .
그대로 일치합니다. -e
패턴이 a로 시작 -
하고 옵션으로 해석되지 않도록 허용 합니다 grep
.--
파일 이름a로 시작 -
하고 다음으로 해석되지 않는 grep
옵션은 다음과 같습니다.언제나grep
대화형으로 호출할 때는 대부분 문제가 없지만 이러한 상황이 언제 발생할지 모르기 때문에 스크립트 내에서 호출하는 것이 더 좋습니다 .grep
하지만 참고하세요: 질문이 편집되었으며 스키마 변경 사항은 적용되지 않습니다.모든이 답변의 방법이 완료되었습니다. 패턴 매칭둘 다행이 입력되므로 모두 삭제됩니다. "$i"
두 가지 모두와 일치하는 not for를 찾는 등 패턴을 어떻게든 재해석해야 합니다 . 대신 "${i} "
첫 번째 줄은 일치하지만 두 번째 줄은 일치하지 않는 추가 공백을 찾거나 "${i}s"
두 번째 줄과 일치하지 않습니다. 첫 번째 줄. 또한 를 사용할 때는 -F
문자 클래스를 사용할 수 없으므로 \b
더 이상 사용되지 않습니다.
답변2
원문에는 grep -iwoP
"정확한 일치"라는 개념이 반영되지 않은 것 같지만...
^
검색 문자열과 정확히 일치하는 전체 줄을 제거하려면 줄의 시작과 끝 부분에 고정 해야 합니다 .$
sed "\|^$i$|d" C1.txt