1行のテキストの一部を見つけ、同じ行の別の部分に追加

1行のテキストの一部を見つけ、同じ行の別の部分に追加

私はこれを持っています:

Issue #12345: some more text here https://some.domain/some/path

ビット12345(動的であるため正規表現を渡す必要がある)を見つけ、同じ行の末尾に追加したいと思います。このように:

Issue #12345: some more text here https://some.domain/some/path/12345

sed / awkを使用してこれをどのように達成できますか?

PS:私は周りを見回しましたが、同様の質問は次のとおりです。文字列の一部を同じ文字列の別の部分に置き換える...しかし、正規表現ビットがありません。

答え1

入力がtest.txtファイルにあると仮定すると、次のコマンドが機能します。

sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g' test.txt

ファイルから直接読まない場合は、

input_source | sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g'

出力:

Issue #12345: some more text here https://some.domain/some/path/12345

このコマンドの機能は次のとおりです。

^(.*)ファイルの先頭から始めて、次の一致が ([[:digit:]]{5})次の5桁に一致するまですべてを取得します。一致する各グループ(.*)$に番号が付けられた(この場合は1-3)、ファイルの終わりまですべてをインポートし、 \1\2\3\/\2出力を変換してインポートします。元のテキスト(1-3と一致)、「/」、および2番目の一致。

後で参照できるように問題をより具体的に説明できる場合は理想的です。たとえば、1行の最初の5桁の数字を探し、その数字(先行スラッシュを含む)を行の末尾に追加し、入力内のすべての行に対してこれを行うとします。私はそれがあなたが意味するものだと思いました。そうでない場合は、質問をより具体的に更新する必要があるかもしれません。

以前の質問を引用するよりも、自分が試したいくつかの試みをリストすることもできます。また、あなたがしたいことをよりよく理解するのに役立ちます。

答え2

sed 's,\([[:digit:]][[:digit:]]*\).*,&/\1,' file

または、パターンで拡張正規表現を処理するsed必要がある場合-E

sed -E 's,([[:digit:]]+).*,&/\1,' file

代替式は、そのsed行の最初の正の整数(数値文字列)を見つけてキャプチャします。また、その点から行末までの残りの行とも一致します。式の代替部分は、行の一致するビットを一致した項目(&)に置き換え、その後にスラッシュとキャプチャされた数値文字列が続きます。

代替部分にスラッシュが含まれているため、式では区切り文字としてコンマを使用していますが、次のようにコマンドを作成することもできます。

sed -E 's/([[:digit:]]+).*/&\/\1/' file

上記のコマンドは、すべての入力ラインで交換を実行します。文字列で始まる行に制限するには、Issue #次のようにします。

sed -E '/^Issue #/s,([[:digit:]]+).*,&/\1,' file

答え3

私は次の方法でそれをしました

注文する

i=`awk '{print $2}' file.txt| sed "s/^#//g"| sed "s/:$//g"`
awk -v i="$i" '{print $0"/"i}' filetxt

出力

Issue #12345: some more text here https://some.domain/some/path/12345

関連情報