Bash - Sed / Awk 用新行替换字符串

Bash - Sed / Awk replacing string with new line

我有一个包含如下字符串的文件,我想用新行替换 "steps:" 和“-”之间的所有内容:

- name: Change It uid: Change It_TRANS_App - Web type: TRANSACTION steps: 02 - name: Change It 1 type: BSTEP uid: Step 1_STEP_Change It_TRANS_App -strong text Web rules:

我试过像这样使用 awk:

echo $string | awk {'gsub(/steps:.*?-/ , 'steps:\n-' )'; print [=12=]}

但是,我收到以下错误:

awk: {gsub(/steps:.*?-/ , steps:n- )
awk:                          ^ syntax error
awk: fatal: 0 is invalid as number of arguments for gsub

我也尝试过使用 sed:

sed -r 's:/\bsteps:\b.*?-/\n/' stringfile.txt > output.txt

并删除“:”:

sed -r 's/\bsteps.*?-/\n/' stringfile.txt > output.txt

在第一种情况下,我得到错误:

sed: -e expression #1, char 28: unterminated `s' command

在第二个 sed 中,我删除了很多不应该删除的内容。

[Edit] 正如你们告诉我的那样,我忘记输入预期的输出,我一直认为它会很简单,但我并不擅长。我想 "break" 作为一个新行,在 "step" 之后切掉单词,在这种情况下,将是“02”。 这将是第一次出现的“-”:

- name: Change It uid: Change It_TRANS_App - Web type: TRANSACTION steps:
- name: Change It 1 type: BSTEP uid: Step 1_STEP_Change It_TRANS_App -strong text Web rules:

你很接近:

awk '{gsub(/steps:.*-/,"steps:\n-");print [=10=]}' <<< "$sting"
- name: Change It uid: Change It_TRANS_App - Web type: TRANSACTION steps:
-strong text Web rules:

可以缩短为:

awk '{gsub(/steps:.*-/,"steps:\n-")}1' <<< "$sting"

参考编辑评论:

awk '{gsub(/steps:[^-]*-/,"steps:\n-")}1' t
- name: Change It uid: Change It_TRANS_App - Web type: TRANSACTION steps:
- name: Change It 1 type: BSTEP uid: Step 1_STEP_Change It_TRANS_App -strong text Web rules:

由于 sed 不支持非贪婪模式 *?,您可以使用取反 class 字符 class.

sed -r 's/\bsteps[^-]*-/\n-/' file

示例:

$ sed -r 's/\bsteps[^-]*/\n/' file
- name: Change It uid: Change It_TRANS_App - Web type: TRANSACTION 
- name: Change It 1 type: BSTEP uid: Step 1_STEP_Change It_TRANS_App -strong text Web rules:

虽然 awksed 专家提供了解决方案,但我可以建议考虑使用 Perl。

要用字符串中第一次出现 - 之前的所有内容替换新行:

echo $string | perl -pe 's/(.*steps:).*?(-.*)/\n/'
- name: Change It uid: Change It_TRANS_App - Web type: TRANSACTION steps:
- name: Change It 1 type: BSTEP uid: Step 1_STEP_Change It_TRANS_App -strong text Web rules:

要用字符串中最后一次出现 - 之前的所有内容替换新行:

echo $string | perl -pe 's/(.*steps:).*(-.*)/\n/'
- name: Change It uid: Change It_TRANS_App - Web type: TRANSACTION steps:
-strong text Web rules:

括号内的两个表达式在替换表达式的后半部分被称为$1 和$2。然后中间的?规定了.*是贪心还是不贪心。