我正在寻找一种方法来读取文件中与特定字符串匹配的行,以获取字符串的其余部分,并将其附加到已读取的同一文件中。
所以我想把这个转过来:
// 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:
的任何行,以获取该部分的其余部分,并在文件前加上它。
我想对整个文件文件夹进行递归操作。
答案 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
命令附加整个文件,该文件将评估以下命令。