次のデータを想定します。わかりやすくするために、以下の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]
Æ
Ê
DZS
Dzs
答え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