여러 텍스트 파일이 포함된 폴더가 있습니다.
apple.txt, book.txt, Tooth.txt 등
다음과 같이 각 텍스트 파일을 처리하기 위해 여러 sed 명령이 포함된 bash 스크립트를 만들었습니다.
...
find /directory/. -type f -exec sed -i 's/one/two/g' {} \;
...
이 라인은 잘 작동합니다.
이러한 작업을 수행하기 위해 유사한 방식(단일 명령)으로 모든 개별 텍스트 파일을 처리하는 방법이 있습니까?
가장 긴 문자열에서 가장 짧은 문자열로 줄을 정렬합니다(각 줄에는 공백 없이 하나의 문자열이 포함됩니다).
중복된 행을 제거하세요.
답변1
단일 명령에 대한 요구 사항이 무엇인지 잘 모르겠지만 다음은 매우 유사합니다.
(cd /directory/; find -type f -printf '%P\0' | while IFS= read -r -d '' fn; do
awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
mv "$fn.~" "$fn"
done)
첫 번째 줄은 가능한 가장 강력한 방법으로 파일 이름을 읽습니다.
두 번째 줄에서는 모든 작업이 수행됩니다.
- awk는 각 줄의 시작 부분에 문자 수(+ 공백)를 추가합니다.
- -n(숫자), -u(고유) 및 -r(역방향) 프로세스 파일 정렬
- sed 선행 문자 수 제거
- 그런 다음 임시 파일에 덤프됩니다.
그런 다음 mv 줄은 임시 파일을 원본 파일에 씁니다(파이프라인 중에 완료할 수 없기 때문입니다).