내 디렉토리에 한 줄의 .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
명령에 대한 인수는sed
GNU 확장이므로 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