GNU/Linux >> Linux の 問題 >  >> Linux

bash での複雑なテキスト配置

すべてのコマンドと引数に # が含まれていない場合 、および別の 1 文字 (バイト 1 で指定された ASCII 文字など) の場合、その別の文字を追加の区切り文字として挿入し、column を使用できます。 コメントを揃えます(この回答を参照)。つまり、次のようになります:

$ sed $'s/#/\001#/' input-file | column -ets $'\001'
# Lines starting with # stay the same
# Empty lines stay the same
# only lines with comments should change

ls                                        # show all major directories
                                          # and other things

cd                                        # The cd command - change directory
                                          # will allow the user to change between file directories

touch                                     # The touch command, the make file command
                                          # allows users to make files using the Linux CLI #  example, cd ~

bar foo baz                               # foo foo foo

column の場合 -e をサポートしていません 空行がなくなるのを避けるために、空行に何かを追加することができます (たとえば、スペースや上記の区切り文字):

$ sed $'s/#/\001#/;s/^$/\001/' input-file | column -ts $'\001'
# Lines starting with # stay the same
# Empty lines stay the same
# only lines with comments should change

ls                                        # show all major directories
                                          # and other things

cd                                        # The cd command - change directory
                                          # will allow the user to change between file directories

touch                                     # The touch command, the make file command
                                          # allows users to make files using the Linux CLI #  example, cd ~

bar foo baz                               # foo foo foo

シェルだけでテキストを処理するのは少し厄介で、エラーが発生しやすい可能性があります (「シェル ループを使用してテキストを処理するのはなぜ悪い習慣と見なされるのですか?」を参照してください)。一般的に、このようなタスクには他のプログラミング言語を使用することをお勧めします。

perl -ne 'if (/^([^#]+?)\s*#(.*)$/) { printf("%-16s#%s\n", $1, $2) } else { print }' file

これは、Perl を使用して # の前のビットをキャプチャします。 (最後の単語と # の間のスペースを破棄します ) と少し後。一致が成功した場合、テキストに 16 文字の場所を割り当て、書式設定されたテキストとコメントを出力します。一致が失敗した場合 (行が空白であるか、# で始まっているため) )、行は変更されずに印刷されます。

# Lines starting with # stay the same
# Empty lines stay the same
# only lines with comments should change

ls              # show all major directories
                # and other things

cd              # The cd command - change directory
                # will allow the user to change between file directories

touch           # The touch command, the make file command
                # allows users to make files using the Linux CLI #  example, cd ~

bar foo baz     # foo foo foo

必要なことを実行する Python スクリプトを次に示します。

#!/usr/bin/env python
# -*- encoding: ascii -*-
"""align.py"""

import re
import sys

# Read the data from the file into a list
lines = []
with open(sys.argv[1], 'r') as textfile:
    lines = textfile.readlines()

# Iterate through the data once to get the maximum indentation
max_indentation = 0
comment_block = False
for line in lines:

    # Check for the end of a comment block
    if comment_block:
        if not re.match(r'^\s*#.*$', line):
            comment_block = False

    # Check for the beginning of a comment block
    else:
        if re.match(r'^[^#]*[^ #].*#.*$', line):
            comment_block = True
            indentation = line.index('#')
            max_indentation = max(max_indentation, indentation)

# Iterate through the data a second time and output the reformatted text
comment_block = False
for line in lines:
    if comment_block:
        if re.match(r'^\s*#.*$', line):
            line = ' ' * max_indentation + line.lstrip()
        else:
            comment_block = False
    else:
        if re.match(r'^[^#]*[^ #].*#.*$', line):
            pre, sep, suf = line.partition('#')
            line = pre.ljust(max_indentation) + sep + suf
            comment_block = True

    sys.stdout.write(line)

次のように実行します:

python align.py input.txt

次の出力が生成されます:

# Lines starting with # stay the same
# Empty lines stay the same
# only lines with comments should change

ls                # show all major directories
                  # and other things

cd                # The cd command - change directory  
                  # will allow the user to change between file directories

touch             # The touch command, the make file command 
                  # allows users to make files using the Linux CLI #  example, cd ~

bar foo baz       # foo foo foo

Linux
  1. 着信メールをText/plainからText/htmlに変更しますか?

  2. 2つの特定の行の間にテキストを抽出しますか?

  3. grep でテキスト ファイルの空行を削除する

  1. Bash でテキスト ファイルをコマンドとして実行する

  2. テキスト ファイルから奇数行または偶数行を削除する

  3. bashスクリプトは、ファイルの最初の行にテキストを追加します.

  1. テキストファイル内の重複行を削除するにはどうすればよいですか?

  2. bash の改行でテキストをエコーする

  3. 複数行が連続するテキストファイルを並べ替える