# New line in substitution string?

**URL:** <https://discourse.julialang.org/t/new-line-in-substitution-string/21891>\
**Category:** General Usage\
**Created:** [March 14, 2019, 10:19pm UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891 "2019-03-14T22:19:48Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![nickeubank](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nickeubank/32/3878_2.png) [@nickeubank](https://discourse.julialang.org/u/nickeubank)\
**Post date:** [March 14, 2019, 10:19pm UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/1 "2019-03-14T22:19:48Z")

</div>

How does one put a new line (`\n`) in a substitution string? e.g.:

```julia
println(replace("test string", r"(test string)" => s"\1 \n line 2"))

```

Id like it to return:

```julia
test string
line 2

```

But I get:

```julia
Bad replacement string: \1 \n line 2

```

If I double escape the new line, I just get the escaped literal:

```julia
println(replace("test string", r"(test string)" => s"\1 \\n line 2"))
test string \n line 2

```

(Obviously toy example, I recognize not super motivated. But I have use case where I want to use group names (so need a substitution string) and new lines…)

---

<div class="post-metadata">

**Author:** ![ffevotte](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ffevotte/32/6587_2.png) [@ffevotte](https://discourse.julialang.org/u/ffevotte)\
**Post date:** [March 14, 2019, 11:05pm UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/2 "2019-03-14T23:05:49Z")

</div>

Not sure you can do it with the syntactic sugar of `s"..."`, but at least what you want can be achieved using the standard `SubstitutionString` constructor:

```julia
julia> println(replace("test string", r"(test string)" => SubstitutionString("\\1\nline 2")))
test string
line 2

```

---

<div class="post-metadata">

**Author:** ![nickeubank](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nickeubank/32/3878_2.png) [@nickeubank](https://discourse.julialang.org/u/nickeubank)\
**Post date:** [March 14, 2019, 11:18pm UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/3 "2019-03-14T23:18:19Z")

</div>

ah, interesting. OK, thanks!

---

<div class="post-metadata">

**Author:** ![yha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yha/32/3502_2.png) [@yha](https://discourse.julialang.org/u/yha)\
**Post date:** [March 15, 2019, 12:25am UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/4 "2019-03-15T00:25:44Z")

</div>

Can also be done with an actual newline inside a triple-quoted string:

```julia
julia> s"""1
       2""" == SubstitutionString("1\n2")
true

```

---

<div class="post-metadata">

**Author:** ![bennedich](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bennedich/32/4894_2.png) [@bennedich](https://discourse.julialang.org/u/bennedich)\
**Post date:** [March 15, 2019, 5:38am UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/5 "2019-03-15T05:38:32Z")

</div>

I usually use the `@s_str` macro directly for this:

```julia
julia> println(replace("test string", r"(test string)" => @s_str("\\1\nline 2")))
test string
line 2

```

---

<div class="post-metadata">

**Author:** ![Liso](https://avatars.discourse-cdn.com/v4/letter/l/898d66/32.png) [@Liso](https://discourse.julialang.org/u/Liso)\
**Post date:** [March 15, 2019, 6:33am UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/6 "2019-03-15T06:33:45Z")

</div>

> <https://github.com/JuliaLang/julia/issues/27125>
>
> While trying to create documentation for SubstitutionString (#26497), I found th…at \`replace\` using \`SubstitutionString\`s doesn't work if the substition string has a newline or other escape sequence in it. 
> 
> \`\`\`
> julia\> msg = "#Hello# from Julia";
> 
> julia\> re = r"#(.+)# from (?\<name\>\\w+)";
> 
> julia\> subst = s"FROM: \\g\<name\>\\n MESSAGE: \\1"
> s"FROM: \\\\g\<name\>\\\\n MESSAGE: \\\\1"
> 
> julia\> replace(msg, re =\> subst)
> ERROR: Bad replacement string: FROM: \\g\<name\>\\n MESSAGE: \\1
> Stacktrace:
> \[1\] error at .\\error.jl:33 \[inlined\]
> \[2\] replace\_err at .\\regex.jl:241 \[inlined\]
> \[3\] \_replace(::Base.GenericIOBuffer{Array{UInt8,1}}, ::Base.SubstitutionString{String}, ::String, ::UnitRange{Int64}, ::Regex) at .\\regex.jl:302
> \[4\] #replace#350(::Int64, ::Function, ::String, ::Pair{Regex,Base.SubstitutionString{String}}) at .\\strings\\util.jl:427
> \[5\] replace(::String, ::Pair{Regex,Base.SubstitutionString{String}}) at .\\strings\\util.jl:415
> \[6\] top-level scope
> 
> julia\> subst = s"FROM: \\g\<name\>; MESSAGE: \\1"
> s"FROM: \\\\g\<name\>; MESSAGE: \\\\1"
> 
> julia\> replace(msg, re =\> subst) #works fine when \\n is removed
> "FROM: Julia; MESSAGE: Hello"
> \`\`\`
> 
> Looking at the code, when the \`\_replace\` function (in regex.jl) sees a backslash, it expects another backslash, a digit or a 'g', and throws an error with \`replace\_err\` if it doesn't see one of those. Another consequence of this is that the replacement string can't contain things like Unicode codepoint sequences (\`\\u0B85\`).

---

<div class="post-metadata">

**Author:** ![Muhammed\_Fatih\_Talu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/muhammed_fatih_talu/32/14456_2.png) [@Muhammed\_Fatih\_Talu](https://discourse.julialang.org/u/Muhammed_Fatih_Talu)\
**Post date:** [April 30, 2020, 9:04am UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/7 "2020-04-30T09:04:09Z")

</div>

I use this code :  
rapur\*=string(:epoch," “, epoch,” “,accuracy(w,dtrn,predict),” “,  
:tst,accuracy(w,dtst,predict)  
,”\n")

output is : “epoch 0 0.06898333333333333 tst0.0717\nepoch 1 0.8966 tst0.9009\n”  
How I can fixed this please.

---

<div class="post-metadata">

**Author:** ![tlienart](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tlienart/32/7640_2.png) [@tlienart](https://discourse.julialang.org/u/tlienart)\
**Post date:** [April 30, 2020, 9:32am UTC](https://discourse.julialang.org/t/new-line-in-substitution-string/21891/8 "2020-04-30T09:32:10Z")

</div>

(0): use backticks to separate your code

```julia
rapur = IOBuffer()
...
write(rapur, "epoch $epoch accuracy $(accuracy(w, darn, predict))")
...
rapur = String(take!(rapur))

```

Using a IOBuffer to create strings incrementally tends to be better than using `*=` repeatedly.
