特定の場所の特定の文字を削除するシェルスクリプト

特定の場所の特定の文字を削除するシェルスクリプト

次のデータを想定します。わかりやすくするために、以下の29の位置を使用しています。場所29が文字または数字で始まるかどうかを確認したいと思います。たとえば、最初の行から文字「U」を削除する必要がある場合は、2番目の行「D」を削除する必要があり、3番目の行は数字で始まるため、何もする必要はありません。

47720920010500002           U314178
37966744783100812           D123455
37966880762200334           356678

私は次を試しました

sed 's/^\(.\{212\}\)U/\&/' $file_name   

...212番目の文字「U」を空白に置き換えます。

cut -c -211,213- $file_name 

...位置212からスペースを削除します。

定数Uの場合、このコードは機能します。 azのすべてのaplhabetsを確認するには、コマンド(存在する場合)の助けが必要です。

答え1

あなたは以下に密接に関連しています。

sed 's/^\(.\{212\}\)U/\&/' $file_name

を使用して最初の212文字をキャプチャしました\(...\)。あなたがしなければならない\1のは、交換でそのコンテンツを参照することだけです。 literalを含む&一致するフルテキストに置き換えられますU\&&

また、212 番目の文字を削除する場合は、212 文字ではなく、前の 211 文字を一致させることになります。

だから:

sed 's/^\(.\{211\}\)U/\1/' < "$file_name"

または:

sed -- 's/^\(.\{211\}\)U/\1/' "$file_name"

(また、不足している引用符を追加し、$file_nameファイル名が次に始まるのを防ぐ2つの異なる方法を示しました-(最初の方法は、名前付きファイルでも機能し、-ファイルを開くことができない場合は実行を防ぐためです)。 。sed

U単一の文字と一致するように変更します[[:alpha:]](まあ、人間の言語スクリプトで使用されるグラフィック記号は文章ではありません)。または、[[:upper:]]大文字またはASCII文字の場合(いいえ、これは通常/などの文字を含むものと同じではなく、一部のロケールでは/などの複数文字の組み合わせ要素でもあります[ABCDEFGHIJKLMNOPQRSTUVWXYZ])。[A-Z]ÆÊDZSDzs

答え2

awkテストおよび切断可能:

awk '! /^[[:alpha:]]/ { print; next; }
{ print substr ($0, 1, 211) substr ($0, 213); }'

短いデータでテストします(4番目の場所を削除)。

答え3

POSIX awkを使用してください。

$ awk 'substr($0,29,1) ~ /[[:alpha:]]/{ $0=substr($0,1,28) substr($0,30) } 1' file
47720920010500002           314178
37966744783100812           123455
37966880762200334           356678

答え4

使用幸せ(以前のPerl_6)

raku -pe 's/ ^ .**28 <(<alpha>)> //;' 

または

raku -pe 's/ ^ .**28 <(<:L>)> //;'  

上記は、最初の28文字以降の29文字が<alpha>(最初の例)<:L>か(Unicode文字、2番目の例)かを確認します。 Character クラス<:L>はの略で<:Letter>、両方使用できます。

技術的には、<alpha>アルファベット文字とアンダースコア(_)を一致させます。一方、文字クラスは<:L>Unicode ユニバーサルクラス名を使用します。

上記の正規表現は、キャプチャタグ...を使用して、OPが省略したい/文字以外の識別され<(た要素を削除します。)><alpha><:L>

入力例:

47720920010500002           U314178
37966744783100812           D123455
37966880762200334           356678

出力例:

47720920010500002           314178
37966744783100812           123455
37966880762200334           356678

https://raku.org

関連情報