for in 루프에서 sed를 사용하여 파일에서 단어 삭제

for in 루프에서 sed를 사용하여 파일에서 단어 삭제

텍스트(txt가 아님)가 포함된 "book" 파일이 있습니다. 또한 해당 파일에서 제거해야 할 단어 목록도 있습니다. 이 스크립트를 작성했지만 어떤 이유로 실행 후 파일이 변경되었는지 확인하려고 하면 변경 사항이 없습니다. 결과를 book>output.txt로 출력하려고 시도했지만 "output"에는 여전히 "book"과 동일한 텍스트가 있습니다.

암호:

for word in {am pm cm words count ......}
do
    sed -i 's/${word}//g' book
done

목록에 있는 단어가 삭제되어야 하는데 왜 삭제되지 않는지 아시나요?

답변1

변수는 작은따옴표 내에서는 확장되지 않지만 큰따옴표 내에서는 확장됩니다. 너는 가야 해

for word in am pm cm words count etc
do
  sed -i "s/${word}//g" book
done

한 번만 호출 해도 sed동일한 효과를 얻을 수도 있습니다.

sed -i "s/am\|pm\|cm\|words\|count//g" book

답변2

단어 목록이 매우 긴 경우 배열을 사용하여 bash형식을 지정할 수 있습니다.

words=(am pm cm words count etc)

fmt=$(IFS='|'; printf '%q' "s/${words[*]}//g")

echo sed -i "$fmt" book
  • 필요한 경우 배열 단어에 더 많은 요소를 추가하면 됩니다.

  • echosed가 작업을 수행할 수 있도록 제거되었습니다 .

관련 정보