각 줄의 단어를 정렬하고 파일을 그 자리에서 편집합니다.

각 줄의 단어를 정렬하고 파일을 그 자리에서 편집합니다.

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

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]}- 정렬된 단어를 한 줄로 연결

관련 정보