sed:以时间戳格式插入变量

时间:2014-02-11 15:54:48

标签: bash sed

我想使用sed从文件中提取两个特定字符串之间的所有行。 我需要在脚本上执行此操作,我的两个字符串是变量。 字符串将采用某种时间戳格式,这意味着它们可以是: 2014/01/012014/01/01 08:01

我正在尝试使用类似的东西:

sed -n '/$1/,/$2/p' $file

甚至

sed -n '/"$1"/,/"$2"/p' $file

没有运气,也尝试将/替换为;的分隔符。

我很确定问题是由输入变量中的/和空白引起的,但我无法弄清楚正确的语法。

2 个答案:

答案 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