Как заменить точку в оболочке Bash? - PullRequest
2 голосов
/ 19 декабря 2010

Я хочу сделать что-то вроде этого:

echo "abc edg.txt" | awk -F. '{print $0"---"$1}'

Я ожидаю, что результат должен быть:

abc edg --- txt

но оказывается:

abc edg.txt --- abc edg

Что является причиной этого поведения и как я могу исправить свой код для производствавыход, который я ожидаю?

Ответы [ 4 ]

11 голосов
/ 19 декабря 2010

Если вы просто хотите заменить точку:

var="abc edg.txt"
echo ${var/./---}
9 голосов
/ 19 декабря 2010

В awk, $0 оценивает всю запись, а индексы полей основаны на одном.

Вы, вероятно, хотите сделать:

$ echo "abc edg.txt" | awk -F. '{print $1"---"$2}'
abc edg---txt
3 голосов
/ 19 декабря 2010

Ответ Фредерика Хамиди исправляет вашу проблему с awk, но, поскольку вы спрашивали о том, как разбить строку по точке в оболочке Bash, вот ответ, который делает именно это, не прибегая к awk:

$ foo="abc edg.txt" ; IFS=. ; a=($foo) ; echo ${a[0]}---${a[1]}
abc edg---txt

Еще проще, если вы хотите разделить только на last '.'в строке:

$ foo="abc edg.txt" ; echo ${foo%.*}---${foo##*.}
abc edg---txt
2 голосов
/ 02 апреля 2015

Awk отлично, но есть и другие способы заменить.

С помощью sed вы можете получить все точки, а не только первую.

echo "abc edg.txt" | sed 's/\./~~/g'

Out: abc edg~~txt

Выражение sed 's/\./~~/g' эквивалентно «заменить \. (точка) на ~~, глобально».

variable="abc here.is.more.dot-separated text"
echo ${variable}| sed 's/\./~~/g'

Out: abc here~~is~~more~~dot-separated text

...