すべてのコマンドと引数に #
が含まれていない場合 、および別の 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