Захватите строки в файле и добавьте в файл часть строки - PullRequest
0 голосов
/ 22 декабря 2018

Я ищу способ прочитать строки в файле, которые соответствуют определенной строке, получить оставшуюся часть строки и добавить ее в тот же файл, который был прочитан.

Так что я хочу включитьthis:

// MARKER: hello world
var x = 32;
// MARKER: meow meow
var v = x + 1
// MARKER: foo bar
var f = 'a'

To:

hello world
meow meow
foo bar
// MARKER: hello world
var x = 32;
// MARKER: meow meow
var v = x + 1
// MARKER: foo bar
var f = 'a'

Я бы хотел сопоставить любую строку, содержащую // MARKER:, получить оставшуюся часть этой части и добавить к ней файл.

Я хотел бы сделать это для целой папки файлов рекурсивно.

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018

Это может работать для вас (GNU sed):

sed -rn 's#^// MARKER: (.*)#\1#p;$!d;e cat file' file

Использовать сопоставление с образцом для печати частей, которые совпадают в начале файла.Затем добавьте весь файл с помощью команды e в sed, которая оценивает следующую команду.

0 голосов
/ 22 декабря 2018
#!/bin/bash
# Provide path of directory as command line arg.
for file in $(find $1 -type f); do { 
    echo $file;
    prefix=`(grep "// MARKER: " $file | sed 's;// MARKER: ;;g')`
    # Adding prefix to file
    echo -e "$prefix\n$(cat $file)" > $file
}
done

сохранить этот скрипт в файл, например.replace.sh

$ bash replace.sh path/to/the/directory
0 голосов
/ 22 декабря 2018

Согласно вашему требованию, эта sed однострочная подойдет:

sed -E -n 's/^\/\/ MARKER: (.*)/\1/p' file;cat file
0 голосов
/ 22 декабря 2018

Вот одно из возможных решений.Использует sponge из moreutils для чтения / записи из того же файла:

find . -type f -print0 | \
xargs -0 -I {} bash -c "grep -Po '(?<=MARKER: ).*' '{}' | \
cat - '{}' | \
sponge '{}'"

Со следующими данными:

$ find -type f
./some/dir/structure/data
./data

$ cat data
// MARKER: hello world
var x = 32;
// MARKER: meow meow
var v = x + 1
// MARKER: foo bar
var f = 'a'

$ cat some/dir/structure/data
// MARKER: cow
var x = 1;
// MARKER: dog
var x = 2;
// MARKER: cat
var x = 3;

Результат:

$ find . -type f -print0 | xargs -0 -I {} bash -c "grep -Po '(?<=MARKER: ).*' '{}' | cat - '{}' | sponge '{}'"

$ cat data
hello world
meow meow
foo bar
// MARKER: hello world
var x = 32;
// MARKER: meow meow
var v = x + 1
// MARKER: foo bar
var f = 'a'

$ cat some/dir/structure/data
cow
dog
cat
// MARKER: cow
var x = 1;
// MARKER: dog
var x = 2;
// MARKER: cat
var x = 3;
...