디렉터리에서 .txt 파일의 시작과 끝 부분에 있는 문자열을 제거하시겠습니까?

디렉터리에서 .txt 파일의 시작과 끝 부분에 있는 문자열을 제거하시겠습니까?

내 디렉토리에 한 줄의 .txt 파일 세트가 있습니다. 모두 동일한 기본 형식을 가지고 있으며 아래의 "입력"이라는 위치에 붙여넣었습니다.

디렉터리의 각 파일에 대해 시작과 끝의 문자열을 제거하여 관심 있는 텍스트만 포함하여 각 파일이 "출력"으로 보이도록 하고 싶습니다.

입력하다:
<s> Text here that I want to keep </s> (31ca4166c37a_.76)

산출:
Text here that I want to keep

어떤 도움이라도 대단히 감사하겠습니다.

답변1

파일을 편집하려면 이전 방법을 사용하십시오 ed.

for file in dir/*.txt; do
  ed -s "$file" <<'EOF'
s!^<s> *!!
s!</s>.*$!!
w
EOF
done

(일반적으로 비표준에 대해 생각하는 대부분의 경우 sed -i비표준을 대신 사용하는 것을 고려해야 합니다 ed.)

답변2

sed와 함께

sed -i.bak 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|' 1-line.txt

시험

echo "</s> Text here that I want to keep </s> (31ca4166c37a_.76)" | sed 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|'
Text here that I want to keep

폴더의 모든 파일에 적용하려면 sed만으로는 불가능합니다. find이 유틸리티는 최소한 다음과 함께 사용해야 합니다 .

find . -type f -exec sed -i.bak 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|' {} \;

이 명령은 .bak변경된 각 파일에 대한 파일을 생성합니다.

노트:

  • -i명령에 대한 인수는 sedGNU 확장이므로 BSD에서 이 명령을 실행하는 경우 sed출력을 새 파일로 리디렉션한 다음 이름을 바꿔야 합니다.
  • POSIX에 지정되어 있지만 일부 find구현에는 매개변수가 없으므로 대신 -exec를 사용해야 합니다 | xargs.

답변3

나는 이것을 제안한다:

sed 's;^[[:blank:]]*<[^>]*>[[:blank:]]*\(.*\)<.*>.*$;\1;' foo

산출:

Text here that I want to keep

이는 레이블에 여러 글자와 임의의 글자가 있고 시작과 끝의 모든 공백이 제거된 경우에 작동합니다. 예를 들면 다음과 같습니다.

<br> Text here that I want to keep    </br> (31ca4166c37a_.76)

답변4

POSIX awk의 경우( 제공한 예제 입력에서와 같이 모든 <s>및 do가 모든 행에 순차적 쌍으로 표시된다고 가정):</s>

$ awk -F'[[:blank:]]*</?s>[[:blank:]]*' '{print $2}' file
Text here that I want to keep

약어 로는 GNU awk를 사용하세요 \s.

$ gawk -F'\\s*</?s>\\s*' '{print $2}' file
Text here that I want to keep

POSIX sed의 경우:

$ sed 's|[[:blank:]]*<s>[[:blank:]]*\(.*[^[:blank:]]\)[[:blank:]]*</s>.*|\1|' file
Text here that I want to keep

관련 정보