抓取文件中的行,并在文件的一部分前添加文件

时间:2018-12-22 02:34:30

标签: bash unix sed terminal grep

我正在寻找一种方法来读取文件中与特定字符串匹配的行,以获取字符串的其余部分,并将其附加到已读取的同一文件中。

所以我想把这个转过来:

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

对此:

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 :(得分:1)

这是一种可能的解决方案。使用moreutils中的sponge从同一文件读取/写入:

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;

答案 1 :(得分:1)

根据您的要求,这种rating:{ type: Number, required: true } 单线可做:

sed

答案 2 :(得分:0)

#!/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

答案 3 :(得分:0)

这可能对您有用(GNU sed):

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

使用模式匹配在文件的开头打印匹配的部分。然后使用sed中的e命令附加整个文件,该文件将评估以下命令。