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

标签 regex bash shell awk sed

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

- 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 $0}

但是,我得到以下错误:

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 中,我删除了很多它不应该删除的内容。

[编辑] 正如你们告诉我的那样,我忘了输入预期的输出,我一直认为这会很简单,但我并不擅长。我想“打破”作为一个新行,只在“步骤”之后删除单词,在这种情况下,将是“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:

最佳答案

由于 sed 不支持非贪婪模式 *?,您可以使用否定类字符类。

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:

关于regex - Bash - Sed/Awk 用新行替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28835830/

相关文章:

html - 在 Ruby 中获取页面上所有 href 内容的最简单方法?

git - 在shell脚本中获取git返回值

bash - Atom Snippets 不适用于 Shell 脚本

linux - 我正在尝试编写一个 bash 脚本,但没有在终端中显示结果

python - python中的正则表达式排除

javascript - 如何解决 JavaScript 中的正则表达式匹配/替换问题?

linux - Bash 备份脚本。需要帮助查找文件并读取它

c - 如何在shell程序中实现&>和&>>?

ios - RegEx 如何正确使用 OR 管道

c++ - 用于为并行 C++ 作业生成输入的 BASH 脚本