【问题标题】:Replacing a line with two new lines用两条新线替换一条线
【发布时间】:2013-08-15 17:23:04
【问题描述】:

我有一个名为 abc.csv 的文件,其中包含以下 6 行:

xxx,one
yyy,two
zzz,all
aaa,one
bbb,two
ccc,all

现在每当all 出现在一行中时,该行都应该​​被onetwo 替换,即:

xxx,one
yyy,two
zzz,one
zzz,two
aaa,one 
bbb,two
ccc,one
ccc,two

有人可以帮忙吗?

【问题讨论】:

  • while read line do echo $line if [ "echo $line | awk -F, '{print $2}'" = "all" ] then echo "echo $line | awk -F, '{print $1},one" echo "echo $line | awk -F, '{print $1},two" fi done

标签: linux shell unix scripting


【解决方案1】:
$ awk -F, -v OFS=, '/all/ { print $1, "one"; print $1, "two"; next }1' foo.input
xxx,one
yyy,two
zzz,one
zzz,two
aaa,one
bbb,two
ccc,one
ccc,two

如果您想坚持使用纯外壳解决方案:

while read line; do
    if [[ "${line}" = *all* ]]; then
        echo "${line%,*},one"
        echo "${line%,*},two"
    else
        echo "${line}"
    fi
done < foo.input

【讨论】:

  • 嗨,阿德里安,我很抱歉。文件中没有“第 1 行、第 2 行、第 3 行和所有内容”。它直接以 xxx 开头,一个 .. 第二行将是 yyy,two。 . 只是为了解释,我写了第 1 行、第 2 行等。
  • @user2686786 啊,这很有道理......我相应地改变了我的答案。这就是你要找的东西吗?
  • while read line do echo $line if [ "echo $line | awk -F, '{print $2}'" = "all" ] then echo "echo $line | awk -F, ' {print $1},one" echo "echo $line | awk -F, '{print $1},two" fi done
  • @user2686786 你的代码根本不能像那样工作(例如,缺少$() 用于命令替换等),但我在答案中添加了一个shell解决方案。
  • 这能回答你的问题吗?
【解决方案2】:

sed:

sed '/,all$/{ s/,all$/,one/p; s/,one$/,two/; }'

当行尾匹配,all时,先将all替换为one并打印;然后将one 替换为two 并让自动打印进行打印。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多