文件 ( myfile.txt
) 包含如下数据:
abc#ab1=23
nrt#
#clb1aX
amd#322
期望的输出:
abc
nrt
clb1ax
amd
我可以这样做,
for i in `cat myfile.txt`
do
s1=`echo $i | cut -d'#' -f1`;
s2=`echo $i | cut -d'#' -f2`;
if [ "$s1" == "" ]; then
echo "$s2"
else
echo "$s1"
fi;
done;
for
但是有没有在不使用and的情况下做到这一点if
,比如在单行中使用awk
or sed
or或其他东西?cut
简短的
awk
解决方案:输出:
回答
;
可以通过在后面添加 将其合并为一行}
,但这样阅读会更难。解释
sed -i
将更改保留在文件中,不要将它们写入stdout
./^#/
- 何时sed
位于以 开头的行上#
。s/#\(.*\)/\1/
- 将第一次出现的 替换#[everything]
为[everything]
。b
- 停止当前行的工作并开始下一个工作。(防止
s/#.*//
命令被执行。)s/#.*//
- 删除第一次出现的#[everything]
.(这将适用于所有行,除非前一个
b
命令提前退出。)myfile.txt
将在其上sed
执行的文件。如果您没有具有值的字段或者它不只是在第二列中怎么办?那么你需要。
给出以下示例:
将给出输出:
或使用
sed
andcut
:s/^#\+//
删除前导哈希(#
发生一次或多次)/^$/d
删除在上面一行是所有散列之后产生空行,或者#####
删除文件中的空行(如果有的话)。cut -d'#' -f1
打印第一个字段-f1
-d'#'
或
sed
仅:s/^\([^#]*\)#.*/\1/
捕获了一组匹配,从请求任何东西的行开始,直到看到第一个哈希,然后将其打印在结果中并忽略其余部分。使用
perl
- 假设样本中给出的只有单一#
输入[^#]\K#.*
如果前面#
有一个非字符,则删除第一次出现的所有字符#
|^#
否则,#
从行首删除同样的事情
sed
另一个 sed
如果您只想删除带有#### 的行