Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Say I have some command that outputs a bunch of strings. The output from this command could look something like:

...
foo
bar
blargh
...

Say I have some set string

myString$Blah

I want to insert each of the strings where the $ is in the output of the command such that I end up with a file that looks like this:

...
myStringfooBlah
myStringbarBlah
myStringblarghBlah
...

What is the easiest way to accomplish this? (Awk and sed preferred)

share|improve this question

3 Answers 3

You don't even need sed or awk.

xargs can do this: with: -L1 -I '$' echo 'myString$Blah'

$ cat x.list
foo
bar
blargh
$ cat x.list | tr '\n' '\0' | xargs -0 -L1 -I '$' echo 'myString$Blah'
myStringfooBlah
myStringbarBlah
myStringblarghBlah
share|improve this answer

You can do this completely in the shell (bash, at least) without too much trouble. Here's a script that does that:

#!/bin/bash

pattern="$1"
input_file="$2"
output_file="$3"

saved_IFS="$IFS"
IFS=$'\n'
# Store each line of the input file into an array named 'lines'.
lines=($(< $input_file))
IFS="$saved_IFS"

# Truncate output file, if any.
cat /dev/null > $output_file

# Substitute each line into the pattern, and write to output file.
for ln in "${lines[@]}"
do
  echo ${pattern/$/$ln} >> $output_file
done

Supposing this script is called script, and you have a file called in.txt with one string per line, then running script in.txt out.txt would give you the desired output in out.txt.

share|improve this answer

Assuming you can use the format string myString&Blah, with an ampersand instead of the dollar sign, pipe your output into this:

sed "s/.*/$format/"

This works because the & is used as an "insert match here" operator in the replacement string. The regex matches the entire line, so it will insert the whole line at the &.

It is important to use the double quotes to allow expansion of the format string.

If you really need to use the ampersand, use this:

sed "s/.*/$(echo "$format" | tr '$' '&')/"

The quotes around $format are important if you have whitespace in the string.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.