How do I /setblock a sign with text?

How do I /setblock a sign with text?

I've tried

/setblock ~ ~1 ~ minecraft:wall_sign 5 {id:"Sign",Text1:"hi;,Text2:""}

In commands, the order of arguments is important. This is the syntax of /setblock:

/setblock <x> <y> <z> <TileName> [dataValue] [oldBlockHandling] [dataTag]

You have given /setblock a [dataTag] argument where [oldBlockHandling] should be, so it doesn't do anything with it.

You will need to give an old block handling mode, such as replace before you give the data tag.

Although likely a typo, it is also important to have correct a JSON format. You have put a ; where a " is needed.

The corrected command should be:

/setblock ~ ~1 ~ wall_sign 5 replace {Text1:"hi",Text2:""}