我如何在sed中的给定行下插入多行,并包含斜线

时间:2018-11-09 23:20:37

标签: linux bash sed scripting

我正在尝试在文件的一行下面插入以下行:

library(tidyverse) 
library(ordinal) # for running ordered logistic regression
#> 
#> Attaching package: 'ordinal'
#> The following object is masked from 'package:dplyr':
#> 
#>     slice

# make a dataframe
df <- data.frame(stringsAsFactors=FALSE,
              Diet = c("REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF",
                       "REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF",
                       "REF", "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM",
                       "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM",
                       "REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF",
                       "REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF",
                       "REF", "REF", "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM",
                       "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM",
                       "REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF",
                       "REF", "REF", "REF", "REF", "REF", "REF", "REF", "REF",
                       "REF", "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM",
                       "IM", "IM", "IM", "IM", "IM", "IM", "IM", "IM"),
           Segment = c("PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI",
                       "PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI",
                       "PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI", "PI",
                       "PI", "PI", "PI", "PI", "PI", "PI", "PI", "MI", "MI",
                       "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI",
                       "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI",
                       "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI",
                       "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI",
                       "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI",
                       "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI",
                       "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI", "MI"),
          Variable = c("hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv", "hpv",
                       "hpv", "hpv", "hpv", "hpv", "hpv", "lpc", "lpc", "lpc", "lpc",
                       "lpc", "lpc", "lpc", "lpc", "lpc", "lpc", "lpc", "lpc",
                       "lpc", "lpc", "lpc", "lpc", "lpc", "lpc", "lpc", "lpc",
                       "lpc", "lpc", "lpc", "lpc", "lpc", "lpc", "lpc", "lpc", "lpc",
                       "lpc", "lpc", "lpc", "lpc", "lpc", "lpc"),
              Rank = c("Severe", "Marked", "Moderate", "Moderate", "Moderate",
                       "Marked", "Marked", "Marked", "Moderate", "Severe",
                       "Moderate", "Marked", "Moderate", "Marked", "Marked", "Mild",
                       "Moderate", "Marked", "Moderate", "Moderate", "Moderate",
                       "Moderate", "Mild", "Moderate", "Mild", "Mild",
                       "Moderate", "Moderate", "Marked", "Moderate", "Moderate",
                       "Moderate", "Marked", "Moderate", "Moderate", "Marked", "Normal",
                       "Mild", "Mild", "Moderate", "Normal", "Normal", "Normal",
                       "Normal", "Mild", "Mild", "Normal", "Moderate", "Normal",
                       "Normal", "Normal", "Normal", "Mild", "Mild", "Normal",
                       "Normal", "Mild", "Normal", "Normal", "Mild", "Normal",
                       "Normal", "Normal", "Normal", "Normal", "Normal", "Normal",
                       "Normal", "Normal", "Normal", "Mild", "Normal", "Normal",
                       "Mild", "Normal", "Normal", "Normal", "Mild", "Moderate",
                       "Normal", "Normal", "Mild", "Normal", "Mild", "Normal",
                       "Normal", "Normal", "Normal", "Mild", "Normal", "Mild",
                       "Moderate", "Normal", "Normal", "Normal", "Normal", "Normal",
                       "Normal", "Normal", "Normal", "Normal", "Mild", "Normal",
                       "Normal", "Normal", "Mild")
      )

# Convert character to factor
df$Diet <- factor(df$Diet, levels = c("REF", "IM"))
df$Segment <- factor(df$Segment, levels = c("PI", "MI", "DI"))
df$Rank <- ordered(df$Rank, levels = c("Normal", "Mild", "Moderate", "Marked", "Severe")) # for running ordered logistic regression
df$Variable <- factor(df$Variable, levels = c("hpv", "snv", "smc", "lpc", "mfh"))

# run ordered logistic regression (olr), extract p values and check model assumption
olr <- df %>%
  group_by(Segment, Variable) %>% 
  nest() %>% 
  mutate(mod      = map(data, ~clm(Rank ~ Diet, data = .x)), # run olr for each dataframe
         Nominal  = map(mod, nominal_test), # somehow, nominal_test does NOT work
         p_nmn    = map_dbl(Nominal, ~.x["Diet", "Pr(>Chi)"]) # extact p value of nominal test
  )                                        

# nominal test can be done by subsetting dataframe directly
# example1
mod1 <- clm(Rank ~ Diet, data = df[1:36, ]) # Segment = "PI", Variable = "hpv"     
Nominal1 <- nominal_test(mod1)
p_nmn1 <- Nominal1["Diet", "Pr(>Chi)"]
p_nmn1
#> [1] 0.6356792

# example2
mod2 <- clm(Rank ~ Diet, data = df[73:107, ]) # Segment = "MI", Variable = "lpc"     
Nominal2 <- nominal_test(mod2)
p_nmn2 <- Nominal2["Diet", "Pr(>Chi)"]
p_nmn2
#> [1] 0.6742354

我要在下面插入这些的行是<Test> <Document> ThisIsATest <Document> </Test>

我可以使用This is a test.命令在其下插入常规文本,并且该文件将包含:

sed -i '/test/aThis is new text' test2.txt

困难的部分是我似乎无法对带有斜线的多行项目执行此操作。有关如何执行此操作的任何想法?我不必使用sed或awk;任何其他Linux实用程序也可以。

1 个答案:

答案 0 :(得分:1)

您可以使用sed的r-> read a file

您将多行替换文本保存在一个文件中,例如xml.txt,您只需执行以下操作:

sed -i '/test/r xml.txt' file

您将得到想要的东西。