OSディストリビューション:Ubuntu 22.04.3 LTS
gawkバージョン:GNU Awk 5.1.0、API:3.0(GNU MPFR 4.1.0、GNU MP 6.2.1)
テキストファイルがあり、たまに1行にAが表示されます。目立つ量のスペースとランダムなテキストが続きます。私はgawkを使ってこの行を検索し、行の左側を修正しています。
入力する:
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
予想出力:
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
WORDWRAP random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
WORDWRAP random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
このコマンドは機能し、予想される出力を返します。
gawk '/^[[:space:]]{75}/ { $0 = substr($0,1,15) " WORDWRAP " substr($0,26) }1' input.txt
私がしたいのは、間隔式の繰り返し間隔とsubstr関数の開始長さの値に変数を割り当てることです。これは、入力ファイルによって変更される可能性があるためです。
3つの環境変数を設定しました。
export PH1="75"; export PH2="15"; export PH3="26"
次に、次のコマンドを実行してみます。
gawk -v gph1="${PH1}" -v gph2="${PH2}" -v gph3="${PH3}" '/^[[:space:]]{gph1}/ { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }1' input.txt
変更されていない入力のみを返します。繰り返し間隔を実際の値に設定し、substrの開始値と長さの値に変数を保持する場合:
gawk -v gph2="${PH2}" -v gph3="${PH3}" '/^[[:space:]]{75}/ { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }1' input.txt
動作し、期待される出力を返します。
私も変更されていない入力を返すので、成功せず、これを試しました。
gawk '/^[[:space:]]{ENVIRON["PH1"]}/ { $0 = substr($0,1,ENVIRON["PH2"]) " WORDWRAP " substr($0,ENVIRON["PH3"]) }1' input.txt
ただし、これは反復間隔を実際の値に設定すると機能します。
gawk '/^[[:space:]]{75}/ { $0 = substr($0,1,ENVIRON["PH2"]) " WORDWRAP " substr($0,ENVIRON["PH3"]) }1' input.txt
間隔式で変数を繰り返し間隔として使用する方法はありますか?
(2023-09-30追加)この質問に対する答えは「はい」ですが、正規表現定数にはありません。受け取ったフィードバックに基づいて、コマンドを次のように変更しました。
gawk -v gph1="${PH1}" -v gph2="${PH2}" -v gph3="${PH3}" ' $0 ~ "^[[:blank:]]{" gph1 "}" { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }1' input.txt
ベストアンサー1
BEGIN{...}
ブロックに必要な正規表現を作成できます。たとえば、次のようになります。
BEGIN { regex = "^[[:space:]]{" gph1 "}" }
次に、基本スクリプトは$0
入力行()を正規表現と比較します。たとえば、次のようになります。
# replace this:
/^[[:space:]]{gph1}/
# with this:
$0 ~ regex
次の変更を現在のgawk
スクリプトに適用します。
gawk -v gph1="${PH1}" -v gph2="${PH2}" -v gph3="${PH3}" '
BEGIN { regex = "^[[:space:]]{" gph1 "}" }
$0 ~ regex { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }
1
' input.txt
これで以下が生成されます。
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
WORDWRAP random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
WORDWRAP random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text