получить первую часть строки, которая состоит из двух частей - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть строка, состоящая из двух частей (путь и владелец), разделенных пробелом.

Это входной файл input.txt

/dir1/dir2/file1 @owner1
/dir1/dir2/foo\ bar @owner2

Я хочу извлечь все пути к отдельному выходному файлу - output.txt Я не могу использовать пробел в качестве разделителя, поскольку пути могут также содержать имена файлов с пробелом и разделителем в них

/dir1/dir2/file1
/dir1/dir2/foo\ bar

Ответы [ 6 ]

2 голосов
/ 21 февраля 2020

Здесь может быть другой способ сделать это с rev + GNU grep:

rev file | grep -oP '.*@ \K.*' | rev

ИЛИ

rev file | grep -oP '.*@\s+\K.*' | rev

С оригинальным простым решением go с:

awk -F' @' '{print $1}' Input_file
1 голос
/ 22 февраля 2020

Вы можете попробовать с простым awk

awk ' { $NF=""; print } ' 

Попробуйте здесь https://ideone.com/W8J1ZO

1 голос
/ 21 февраля 2020

Вы можете поместить их в массив и обработать

mapfile test < input.txt; test=("${test[@]% *}")
echo "${test[@]}"
echo "${test[0]}"
echo "${test[1]}"
1 голос
/ 21 февраля 2020

Одна строка будет делать это:

while read p _; do printf '%q\n' "$p"; done <input.txt >output.txt
1 голос
/ 21 февраля 2020

Я бы обрезал конечную часть с помощью sed.

sed 's/ [^ ]*$//' /path/to/file

Это будет соответствовать концу строки:

  • ( пусто) соответствует пробелу
  • [^ ]* соответствует самой длинной строке без пробелов, т. е. @owner1
  • $ соответствует концу строки

И они будут заменены ничем, что будет действовать так, как будто вы удалили соответствующую строку.

1 голос
/ 21 февраля 2020

Предполагая, что пробелы, которые не должны анализироваться как разделители, экранируются обратным символом sh, как в вашем примере, вы можете использовать следующее регулярное выражение:

^(\\ |[^ ])*

Например, с grep:

grep -oE '^(\\ |[^ ])*'

Регулярное выражение с начала строки сопоставляет любое число с обратным символом sh, за которым следует пробел или любой другой символ, кроме пробела, и останавливается при первом появлении пробела, который не ' t предшествует обратная коса sh.

Вы можете попробовать здесь .

...