行内のテキストの一部を検索し、同じ行の別の部分に追加します。

行内のテキストの一部を検索し、同じ行の別の部分に追加します。

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

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 を使用してこれを実現するにはどうすればよいですか?

追記: いろいろ調べてみましたが、似たような質問はこれだけでした:文字列の一部を同じ文字列の別の部分に置き換える...ただし、正規表現の部分が欠けています。

答え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\2\3\/\2一致した各グループには番号が付けられ (この場合は 1 ~ 3)、出力をフォーマットして元のテキスト (一致 1 ~ 3)、'/'、次に 2 番目の一致を取得します。

今後の参考のために、問題をより具体的に説明していただけると理想的です。たとえば、行の最初の 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

関連情報