我想使用sed从文件中提取两个特定字符串之间的所有行。
我需要在脚本上执行此操作,我的两个字符串是变量。
字符串将采用某种时间戳格式,这意味着它们可以是:
2014/01/01
或2014/01/01 08:01
我正在尝试使用类似的东西:
sed -n '/$1/,/$2/p' $file
甚至
sed -n '/"$1"/,/"$2"/p' $file
没有运气,也尝试将/
替换为;
的分隔符。
我很确定问题是由输入变量中的/
和空白引起的,但我无法弄清楚正确的语法。
答案 0 :(得分:3)
尝试使用双引号而不是单引号。
sed -n "/$1/,/$2/p" $file
答案 1 :(得分:3)
使用备用正则表达式分隔符的语法是:
\ c 正则表达式 c
匹配与正则表达式regexp匹配的行。 c 可以是任何字符。
https://www.gnu.org/software/sed/manual/sed.html#Addresses
所以,选择一个
sed -n '\@'"$1"'@,\@'"$2"'@p' "$file"
sed -n "\\@$1@,\\@$2@p" "$file"
sed -n "$( printf '\@%s@,\@%s@p' "$1" "$2" )" "$file"
或awk
awk -v start="$1" -v end="$1" '$0 ~ start {p=1}; p; $0 ~ end {p=0}' "$file"
从第一个 $ 1到 last $ 2:
sed -n "\\@$1@,\$p" "$file" | tac | sed -n "\\@$2@,\$p" | tac
从第一个$ 1到结尾打印,反转行,从第一个 $ 2打印到新结束,然后再次反转行。
一个例子:从第一个“5”到最后一个“7”
$ set -- 5 7
$ seq 20 | sed -n "\\@$1@,\$p" | tac | sed -n "\\@$2@,\$p" | tac
5
6
7
8
9
10
11
12
13
14
15
16
17