テキストファイルをフォーマットしようとしています。今、一般的には次のようになります。
ApartCD コンパクトディスク CD-ROM コンパクトディスク読み取り専用メモリ CD-RW 書き換え可能なコンパクトディスク CDFS コンパクトディスクファイルシステム CERT コンピュータ緊急対応チーム CFS 中央ファイルシステム、共通ファイルシステムまたはコマンドファイルシステム ACRONYM SPELLED OUTCGA コンピュータグラフィックスおよびアプリケーション CIDR Classless Inter - ドメインルーティングCIFS一般インターネットファイルシステムCMOS相補型金属酸化物半導体CNR通信およびネットワーキングRiserCOMx通信ポート(x =ポート番号)CPU中央処理装置CRT陰極線管DaaSデータサービスDAC自律アクセス制御DB-25シリアル通信D-シェルConnectサーバー、25ピンDB-9シリアル通信D-Shellコネクタ、9ピンDBaaSサービスドデータベースDC DC DDoS分散サービス拒否DDRデュアルデータレートDDR RAMデュアルデータレートランダムアクセスメモリDFS分散ファイルシステムDHCPダイナミックホスト設定プロトコルDIMMデュアルインラインメモリモジュールDINドイツ工業仕様DLTデジタルリニアテープDLPデジタル光学P
これは私がコピーした例です。まず、小文字と大文字の間に改行を挿入したいと思います。私はGNU sedマニュアルを読むことで角かっこを使ってこれを行うことができることを知っていました[:lower:]
([:upper:]
正しい[[:lower:]]+[[:upper:]]
パターンだと思います)。ただし、これを実行するための正しいコマンドや一般的な構文は決まっていません。改行を追加するコマンドを複数見つけましたが、正規表現に挿入するコマンドはありません。
sedを使ったのは今回が初めてです。これが仕事に最適なツールかどうかわかりません。助けてくれてありがとう。別の問題でなければ、命令を説明してください。ありがとうございます。
答え1
GNU sedを使ってこれを試してください:
$ sed 's/\([a-z]\+\)\([A-Z]\)/\1\n\2/g' text.txt
あなたの入力に対して以下が生成されます。
s Apart
CD Compact Disc
CD-ROM Compact Disc-Read-Only Memory
CD-RW Compact Disc-Rewritable
CDFS Compact Disc File System
CERT Computer Emergency Response Team
CFS Central File System, Common File System, or Command File System
ACRONYM SPELLED OUTCGA Computer Graphics and Applications
CIDR Classless Inter-Domain Routing
CIFS Common Internet File System
CMOS Complementary Metal-Oxide Semiconductor
CNR Communications and Networking Riser
COMx Communication port (x=port number)CPU Central Processing Unit
CRT Cathode-Ray Tube
Daa
S Data as a Service
DAC Discretionary Access Control
DB-25 Serial Communications D-Shell Connector, 25 pins
DB-9 Serial Communications D-Shell Connector, 9 pins
DBaa
S Database as a Service DC Direct Current
DDo
S Distributed Denial of Service
DDR Double Data Rate
DDR RAM Double Data Rate Random Access Memory
DFS Distributed File System
DHCP Dynamic Host Configuration Protocol
DIMM Dual Inline Memory Module
DIN Deutsche Industrie Norm
DLT Digital Linear Tape
DLP Digital Light P
いくつかの説明:
パターンを理解したので、「キャプチャグループ」が何であるかを知っているとします。
文字列は's/\([a-z]\+\)\([A-Z]\)/\1\n\2/g'
文字ごとに4つの部分に分けられます/
。
最初の部分s
の意味変える。
2番目の部分はパターンです。このパターンには2つのキャプチャグループ、[a-z]\+
およびが含まれています[A-Z]
。たとえば、入力した「DDoS」という単語を考えてみましょう。最初のキャプチャグループは「o」をキャプチャし、2番目のキャプチャグループは「S」をキャプチャします。パターン全体が「oS」と一致します。
3番目の部分は、\1\n\2
パターンに一致する文字列を置き換えます。 「DDoS」の例では、「o」の\1
最初のキャプチャグループを表します。 「DDoS」の例は、「S」の2番目のキャプチャグループを表します。改行文字を表します。したがって、それらを組み合わせると、一致する文字列「oS」を置き換える「o \ nS」が得られます。[a-z]\+
\2
[A-Z]
\n
4番目の部分は次のことをg
意味します。グローバル。省略すると、sed
最初の一致を見つけて交換して終了します。を使用すると、g
一致するsed
すべての文字列が検索され、置き換えられます。
あなたは参照することができますsed マニュアル詳細な説明。
答え2
GNU は、sed
次のコマンドを使用してs///
改行文字を挿入できます。
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1\n\2/g' file
非GNU(たとえば、macOS、BSD、および他の非Linuxシステム)は、コマンド置換テキストの意味をsed
知らず、文字のみを挿入します。\n
s///
n
改行文字を置き換えるには、次のようにリテラル改行文字をエスケープする必要があります。
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1\
\2/g' file
または、まだデータにない追加のプレースホルダ文字を挿入してy///
改行に置き換えるなどの回避策を使用します(y///
command comprehension \n
)。
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1@\2/g' -e 'y/@/\n/' file
または
sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1@\2/g' file | tr '@' '\n'
[[:lower:]]
単一文字にマッチしますが([[:lower:]]+
または[[:lower:]]\{1,\}
デフォルトの正規表現で書かれている場合)マッチします。少なくともキャラクター。この場合+
(or \{1,\}
)は1つの小文字と一致するのに十分なので、必要ありません。