
ディレクトリに次の単語が表示されるテキストファイルがたくさんあります。
GSM89103AATF
実際、数字は変更される可能性があるため、別の例になる可能性がありますGSM89089AATF
。これらのイベントをGSM89089\nAATF
新しい行挿入に置き換える必要があります。これを作成するために使用できますかsed
?
答え1
GNUを使用できますsed
。
$ sed -r 's/(GSM[0-9]{5})(AATF)/\1\n\2/' file.in >file.out
このパターンは、2つの別々の捕捉グループの第1の部分と一致し、次に第2の部分と一致する。最初の部分の後には常にGSM
5桁の数字が続くと仮定します。置き換えは、単に2つのグループ間に改行を使用してキャプチャしたデータを貼り付けることです。
-r
拡張正規表現を使用しているため、これが必要です。一部の実装では、これらの型の代わりに正規表現をsed
使用します。-E
-r
GNUなしのシステムsed
:
$ sed 's/\(GSM[0-9]\{5\}\)\(AATF\)/\1\
> \2' file.in >file.out
つまり、EREの代わりにBREを使用して-r
GNU拡張を削除するには、aを追加してから\
Enterを押して\1
から、次の行で置換パターンを続行します。 >
あなたが入力するのではなく、プロンプトです。
答え2
これは私のMacとさまざまなLinuxディストリビューションで動作します。
#!/usr/bin/env bash
PATTERN="(GSM[0-9]{5})(AATF)"
sed -E -e $"s_${PATTERN}_\1\\
\2_g" < file_with_values
どこ:
PATTERN
:代替式を読みやすくするために、変数にパターンを定義できます。sed -E -e
:sed
拡張正規表現(-E)を使用し、提供されているスクリプト(-e)を有効にします。$"..."
:文字列を翻訳するために使用され、変数を受け入れます。ここを見てください:バッシュ引用符。どんな場合でも安全ではありませんが、あなたの場合は大丈夫でしょうs_ ..._...\2_g
:は代替文字列です。_
エスケープする必要がないように区切り文字として使用し、キャプチャ/
グループ(\1
and)が必要であることを考慮すると、\2
文字列を読みやすくします。\\
次の新しい行を参照してください。$"..."
新しい行が許可されました
変数が必要ない場合は、$'....'
単一引用符でドル記号を使用できます。この場合、\n
新しい行を使用できますが、挿入することはできません。
使い方は$"..."
かなり移植性があるようです。私のコードは同様の実装を持っており、docker alpine、centos、debian、fedora、ubuntuで動作します。