列の先頭に一重引用符を置き換える

列の先頭に一重引用符を置き換える

一部の列には、先頭の一重引用符を含む入力ファイルを制御できないレベルで受け取りました。

'foo|'012|that's nice|bar

予想される出力を取得するには、各フィールドからすべての先行単一引用符を削除したいと思います。

foo|012|that's nice|bar

awkを使用してgsub正規表現メタ文字が列^ごとに機能すると仮定しましたが、行の先頭でのみ機能するようです。

$ echo "'foo|'012|that's nice|bar" | awk -F'|' '{gsub(/^'\''/,"")}1'
foo|'012|that's nice|bar

各列から先行単一引用符を削除する方法は?

ベストアンサー1

いいえawksed次のようにできます。

sed -E "s/(^|\|)'/\1/g"

-E拡張正規表現に切り替えるオプションは、POSIX規格の次のバージョンに表示される予定ですが、ほとんどの実装ではすでにこれをサポートしていますsed。または、andのperl代わりにwhichを使用できます。sedawk

perl -pe 's/(^|\|)'\''/$1/g'

または:

perl -pe "s/(^|\|)\K'//g"

(試合開始を\K表示します)。K

または:

perl -pe "s/(?<![^|])'//g"

'前に文字がない場合は置き換え可能です|。)

または、対応するawkパターンを使用してください。

perl -F'\|' -pe 's/^'\''// for @F; $_ = join "|", @F'

を使用するには、awk -F'|'上記のperlパターンのように各フィールドに置換を適用する必要がありますawk

awk -F'|' -v OFS='|' '
  {
    for (i = 1; i <= NF; i++) sub(/^'\''/, "", $ i)
    print
  }'

awk場合、特殊なケースとしてフィールド区切り文字が単一文字の場合は正規表現として扱われないため、エスケープする必要はありません|

$in はawk数値を取る単項演算子です。 1との間の数字の場合は、対応するフィールドを返しますNF。数値が0の場合はレコード全体を返し、それ以外の場合は空の文字列を返します。

sub()そして、gsub()2つまたは3つの引数を取ることができ、3番目の引数((唯一の)代替トピック)が指定されていない場合、デフォルトは完全レコード($0)です。他の方法と同様に、他の方法も同様ですgsub()。パターンのすべての発生ではなく、最初のパターンの発生のみが置き換えられます。sub()s/x/y/gs/x/y/sedsub()gsub()

ここで正規表現は最初に固定されているので、一度だけ一致することができるので、とはsub()何のgsub()効果もありません。

IOW は、gsub()各フィールドで 1 つの置換を実行する代わりに、次のことを行います。一つデフォルトでは、分割されていないレコード全体である文字列です。


¹技術的には次のように考えられます。数値文字列。つまり、数値のように見える場合は、それ以外の場合は数値として扱われます。空の文字列は文字列として扱われます。

おすすめ記事