最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Sed to find and replace a substring, then insert the full string - Stack Overflow

programmeradmin1浏览0评论

Example: file contains the following:

lebnassvm0a-dr      test1      /vol/test1
lebnassvm0a-dr      test2      /test2
lebnassvm0a-dr      test3      /test3
stgtestsvm1-dr      test21      /test21
stgtestsvm1-dr      test22      /test22
stgtestsvm1-dr      test23      /test23

I want to find the "-dr" and replace with "-drt" and insert the full string in front of the existing, like this:

lebnassvm0a-drt lebnassvm0a-dr      test1      /vol/test1
lebnassvm0a-drt lebnassvm0a-dr      test2      /test2
lebnassvm0a-drt lebnassvm0a-dr      test3      /test3
stgtestsvm1-drt stgtestsvm1-dr      test21      /test21
stgtestsvm1-drt stgtestsvm1-dr      test22      /test22
stgtestsvm1-drt stgtestsvm1-dr      test23      /test23

Example: file contains the following:

lebnassvm0a-dr      test1      /vol/test1
lebnassvm0a-dr      test2      /test2
lebnassvm0a-dr      test3      /test3
stgtestsvm1-dr      test21      /test21
stgtestsvm1-dr      test22      /test22
stgtestsvm1-dr      test23      /test23

I want to find the "-dr" and replace with "-drt" and insert the full string in front of the existing, like this:

lebnassvm0a-drt lebnassvm0a-dr      test1      /vol/test1
lebnassvm0a-drt lebnassvm0a-dr      test2      /test2
lebnassvm0a-drt lebnassvm0a-dr      test3      /test3
stgtestsvm1-drt stgtestsvm1-dr      test21      /test21
stgtestsvm1-drt stgtestsvm1-dr      test22      /test22
stgtestsvm1-drt stgtestsvm1-dr      test23      /test23
Share Improve this question edited Nov 19, 2024 at 15:23 Gilles Quénot 186k43 gold badges231 silver badges229 bronze badges asked Nov 19, 2024 at 15:21 Bob MooreBob Moore 214 bronze badges 3
  • Do you already know how to replace -dr with -drt? – Ulrich Eckhardt Commented Nov 19, 2024 at 15:24
  • Replacing the -dr with -drt is easy. the part i'm not sure about is inserting the replaced full string with the changed substring. – Bob Moore Commented Nov 19, 2024 at 15:27
  • If you can ever have a first field that does not end with -dr then you should include that in your sample input/output so we can see how that should be handled. – Ed Morton Commented Nov 21, 2024 at 11:23
Add a comment  | 

3 Answers 3

Reset to default 0

What I would do:

$ sed -E 's/^([^-]+-dr)/\1t \1/' file
lebnassvm0a-drt lebnassvm0a-dr      test1      /vol/test1
lebnassvm0a-drt lebnassvm0a-dr      test2      /test2
lebnassvm0a-drt lebnassvm0a-dr      test3      /test3
stgtestsvm1-drt stgtestsvm1-dr      test21      /test21
stgtestsvm1-drt stgtestsvm1-dr      test22      /test22
stgtestsvm1-drt stgtestsvm1-dr      test23      /test23

The regular expression matches as follows:

Node Explanation
^ the beginning of the string anchor
( group and capture to \1:
[^-]+ any character except: - (1 or more times (matching the most amount possible))
-dr '-dr'
) end of \1

This might work for you (GNU sed):

sed 's/^\S*-dr\>/&t &/' file

Replace the first non-white spaced string ending in -dr with itself followed by a t a space and the original string.

Using any awk:

$ awk '{print $1"t", $0}' file
lebnassvm0a-drt lebnassvm0a-dr      test1      /vol/test1
lebnassvm0a-drt lebnassvm0a-dr      test2      /test2
lebnassvm0a-drt lebnassvm0a-dr      test3      /test3
stgtestsvm1-drt stgtestsvm1-dr      test21      /test21
stgtestsvm1-drt stgtestsvm1-dr      test22      /test22
stgtestsvm1-drt stgtestsvm1-dr      test23      /test23

or GNU sed:

$ sed -E 's/\S+/&t &/' file
lebnassvm0a-drt lebnassvm0a-dr      test1      /vol/test1
lebnassvm0a-drt lebnassvm0a-dr      test2      /test2
lebnassvm0a-drt lebnassvm0a-dr      test3      /test3
stgtestsvm1-drt stgtestsvm1-dr      test21      /test21
stgtestsvm1-drt stgtestsvm1-dr      test22      /test22
stgtestsvm1-drt stgtestsvm1-dr      test23      /test23

The above assume given the example provided in the question that you really just want to duplicate and add t to the first field in the input, the requirement to match on -dr is a red herring.

发布评论

评论列表(0)

  1. 暂无评论