This is a so-called "invalid state", because the sign is not meant to be there in a normal situation. So you have to use tricks to get it there and then be careful to not change anything on any of the six adjacent blocks ever again.
With commands, you can just use /setblock
, because it doesn't update the block. But you have to specify everything about the sign. The one in your example can be set like this:
/setblock ~ ~ ~ minecraft:wall_sign 0 replace {Text1:"{\"text\":\"<Line 1>\"}",Text2:"{\"text\":\"<Line 2>\"}",Text3:"{\"text\":\"<Line 3>\"}",Text4:"{\"text\":\"<Line 4>\"}"}
You have to replace the 0 with a number from 0 to 3, depending on the direction of the sign.
You may have to have all four "Text" tags for it to work. The wiki says that, but I didn't test it.
Without commands, you always have to abuse bugs. Those can break in any version, so this is one example for 1.12.2:
Place dirt.
Place a two blocks high flower above it, for example a sunflower.
Place the sign on the side of the top block of the flower.
Break the dirt.
Result: The plant breaks, but the sign doesn't get updated, so it floats.
This relies on this bug.