カンマの後ろ - 目的の線幅の前に改行を作成する

カンマの後ろ - 目的の線幅の前に改行を作成する

次のファイルから:

ruler    1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
\usage{
function(
parameter,
parameterparameter,
parameter = parameter,
parameter = p,
parameter = para,
parameter = para,
paramete = p,
parameterparameter = pa,
parameter = p,
p = pa,
param,
parameterpara = par,
paramet = par,
parameter = param,
parameterpa = param,
...
more lines

「usage」行を「...」行に関連付けてから、80番目の文字(列)の前のコンマの後に新しい改行を作成したいと思います。

現在はn番目のカンマの後に改行していますが、多くの場合、3番目のコンマの後に空白がたくさん残っているため、あまり効率的ではありません。だから私は改行の前にカンマをできるだけ80文字に近づけたいと思います。

sed -i -r '/usage/{:a;N;/\.\.\./!ba;s/\n//g}' filename.txt
sed -i 's/\(\([^,]\+,\)\{3\}\)/\1\n/g;s/\n/\n/g' filename.txt

私は「par」、「fold」、および「fmt」のドキュメントを見ましたが、成功しませんでした。 「fold」は近いですが、カンマではなく空白で行を分割します。

sed -i -r '/usage/{:a;N;/\.\.\./!ba;s/\n//g}' filename.txt
fold -s filename.txt | tee filename.txt

答え1

使用awk:

$ awk '/^\\usage/,/^\.\.\./ { if (length(line $0) >= 80) { print line; line = $0 } else line = line $0; next  }; line != "" { print line; line = "" }; 1' file
         1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
\usage{function(parameter,parameterparameter,parameter = parameter,
parameter = p,parameter = para,parameter = para,paramete = p,
parameterparameter = pa,parameter = p,p = pa,param,parameterpara = par,
paramet = par,parameter = param,parameterpa = param,...
more lines

コードawk、注釈:

/^\\usage/,/^\.\.\./ {
        # This block triggers for all lines between a line
        # starting with "\usage" and another line
        # starting with "..."

        # If our saved output line and the current line together
        # is longer or equal to 80 characters, print the output
        # line and reset it to the current line.  Else, add the
        # current line to the end of the saved output line.
        if (length(line $0) >= 80) {
                print line
                line = $0
        } else
                line = line $0

        # Skip to next line of input.
        next
}

# If we get here and the saved output line is
# non-empty, then there is data to output, so
# do that.
line != "" { print line; line = "" }

# Print all input.
1

答え2

フルルックサウンドモードを使用した怠惰な変形perl

perl -0777 -pi -e '
  s{\\usage.*?\n\.\.\.\n}{
    ($r = $&) =~ s/\n//g;
    $r =~ s/\G.{0,79}(,|.$)\K/\n/g;
    $r
  }gse' your-file

これは作る:

         1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
\usage{function(parameter,parameterparameter,parameter = parameter,
parameter = p,parameter = para,parameter = para,paramete = p,
parameterparameter = pa,parameter = p,p = pa,param,parameterpara = par,
paramet = par,parameter = param,parameterpa = param,...
more lines

関連情報