각 줄의 단어를 정렬하고, 파일을 제자리에서 편집하세요.

각 줄의 단어를 정렬하고, 파일을 제자리에서 편집하세요.

파일을 한 줄씩 읽고 각 줄을 편집한 후 해당 줄을 별도의 파일에 저장합니다.

while read -r line
do
   newline=$(echo $line | sed -r 's/\</\n/g' | sort | tr '\n' ' ')
   echo "$newline" >> newfile
done < "$filename"

$filename그런데 기존 라인을 새 라인으로 교체하고 싶습니다 . cat filename... | xargs -n1 command또는 을 사용할 수 있지만 sed -i ...지금까지 추적이 실패했다는 내용을 읽었습니다.

입력 예는 다음과 같습니다.

1.e4 e5 2.Nf3 Nc6 3.
1.d4 d5 2.e4 dxe4 3.
1.e4 e5 2.Nf3 Nf6 3.

예상되는 결과는 다음과 같습니다.

 1. 2. 3. e4  e5  Nc6  Nf3  
 1. 2. 3. d4  d5  dxe4  e4  
 1. 2. 3. e4  e5  Nf3  Nf6 

답변1

sponge에 설명된 대로 를 사용할 수 있습니다 .표준 입력 또는 파일을 버퍼링할 수 있는 프로그램. 입력을 리디렉션하는 것처럼 전체 루프를 파이프로 연결할 수 있습니다.

while read -r line ; do 
    echo "$line" | sed -r 's/\</\n/g' | sort | tr '\n' ' ' ; 
    echo
done < filename | sponge filename

Perl의 경우 다음과 같이 할 수 있습니다(공백의 양이 다름).

perl -Mlocale -i -lne 'print join " ", sort split/(?<=\.)| /' filename

답변2

방법:

awk 'BEGIN{IGNORECASE=1;}{ gsub(/\./,". ", $0); split($0, w, " "); 
     asort(w);l=""; for(i in w) {l=l" "w[i]} print l}' file

산출:

1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6

대소문자 무시이 작업은 명령줄이나 다음에서 수행할 수 있습니다.시작규칙

split($0, w, " ");- 줄을 별도의 단어로 분할

asort(w);- 배열 값(단어) 정렬

for(i in w) {l=l" "w[i]}- 정렬된 단어를 한 줄로 연결

관련 정보