对每行上的单词进行排序,就地编辑文件

对每行上的单词进行排序,就地编辑文件

我逐行读取文件并编辑每一行并将这些行保存在单独的文件中。

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 commandorsed -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方法:

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]}- 将排序后的单词连接成一行

相关内容