如何使用bash脚本和sed用换行符替换字符串?

Kev*_*ter 12 unix bash shell sed

我有以下输入:

Value1|Value2|Value3|Value4@@ Value5|Value6|Value7|Value8@@ Value9|etc...
Run Code Online (Sandbox Code Playgroud)

在我的bash脚本中,我想@@ 用换行符替换它.我用sed尝试了各种各样的东西,但我没有运气:

line=$(echo ${x} | sed -e $'s/@@ /\\\n/g')
Run Code Online (Sandbox Code Playgroud)

最终,我需要将整个输入解析为行和值.也许我错了.我打算@@ 用换行替换换行符,然后通过设置循环输入IFS='|'以分割值.如果有更好的方法请告诉我,我仍然是shell脚本的初学者.

pru*_*raj 8

这会奏效

sed 's/@@ /\n/g' filename
Run Code Online (Sandbox Code Playgroud)

替换@@换行


itz*_*aki 6

我建议使用tr函数

echo "$line" | tr '@@' '\n'
Run Code Online (Sandbox Code Playgroud)

例如:

[itzhaki@local ~]$ X="Value1|Value2|Value3|Value4@@ Value5|Value6|Value7|Value8@@"
[itzhaki@local ~]$ X=`echo "$X" | tr '@@' '\n'`
[itzhaki@local ~]$ echo "$X"
Value1|Value2|Value3|Value4

 Value5|Value6|Value7|Value8
Run Code Online (Sandbox Code Playgroud)

  • 据我所知, tr 适用于单个字符,而不是字符串。如,`tr 'Ab' 'aB'` 将 `Abracadabra` 变成了 `aBracadaBra`。 (3认同)
  • 你只需要“挤压”:`tr -s '@' '\n'` (2认同)
  • 不过,问题要求替换“@@”*加一个空格*。`tr` 不能这样做。 (2认同)

anu*_*ava 5

使用纯BASH字符串操作:

eol=$'\n'
line="${line//@@ /$eol}"

echo "$line"
Value1|Value2|Value3|Value4
Value5|Value6|Value7|Value8
Value9|etc...
Run Code Online (Sandbox Code Playgroud)