ranjit
ranjit

Reputation: 158

Handling wildcard expansion from a string array in a bash shell scripting

Following is a sample script that I have written

line="/path/IntegrationFilter.java:150:         * <td>http://abcd.com/index.do</td>"
echo "$line"          <-- "$line" prints the text correctly
result_array=( `echo "$line"| sed 's/:/\n/1' | sed 's/:/\n/1'`)
echo "${result_array[0]}"
echo "${result_array[1]}"
echo "${result_array[2]}"  <-- prints the first filename in the directory due to wildcard character *  .

How to get the text "* http://abcd.com/index.do " printed instead of the filename when retrieved from an array?

Upvotes: 0

Views: 1632

Answers (2)

Mikel
Mikel

Reputation: 25596

Assuming bash is the right tool, there are a few ways:

  1. disable filename expansion temporarily
  2. use read with IFS
  3. use the substitution feature of bash expansion

Disabling expansion:

line="/path/IntegrationFilter.java:150:         * <td>http://abcd.com/index.do</td>"
set -f
OIFS=$IFS
IFS=$'\n'
result_array=( `echo "$line"| sed 's/:/\n/1' | sed 's/:/\n/1'`)
IFS=$OIFS
set +f
echo "${result_array[0]}"
echo "${result_array[1]}"
echo "${result_array[2]}"

(note we also had to set IFS, otherwise each part of the contents ends up in result_array[2], [3], [4], etc.)

Using read:

line="/path/IntegrationFilter.java:150:         * <td>http://abcd.com/index.do</td>"
echo "$line"
IFS=: read file number match <<<"$line"
echo "$file"
echo "$number"
echo "$match"

Using bash parameter expansion/substitution:

line="/path/IntegrationFilter.java:150:         * <td>http://abcd.com/index.do</td>"
rest="$line"
file=${rest%%:*}
[ "$file" = "$line" ] && echo "Error"
rest=${line#$file:}

number=${rest%%:*}
[ "$number" = "$rest" ] && echo "Error"
rest=${rest#$number:}

match=$rest

echo "$file"
echo "$number"
echo "$match"

Upvotes: 2

Marc Abramowitz
Marc Abramowitz

Reputation: 3577

How about:

$ line='/path/IntegrationFilter.java:150:         * <td>http://abcd.com/index.do</td>'

$ echo "$line" | cut -d: -f3-
* <td>http://abcd.com/index.do</td>

Upvotes: 0

Related Questions