Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell中的文件中搜索字符串的一部分_Shell_Ksh - Fatal编程技术网

在shell中的文件中搜索字符串的一部分

在shell中的文件中搜索字符串的一部分,shell,ksh,Shell,Ksh,我有一个文件,里面有一张名单。我试图搜索带有特定字符串组的名称,并将它们打印到shell中的新文件中。你能帮忙吗 这是我正在看的。 文本文件(names.txt)包含如下名称 New York_USA Delhi Moscow Tokyo Austin_USA Beijing Chicago_USA 我正试图在一个单独的文件中获得与_USA的名称。 这是我试过的 #/bin/ksh for city in "cat names.txt" do if ["$city" =~ "*_USA"] t

我有一个文件,里面有一张名单。我试图搜索带有特定字符串组的名称,并将它们打印到shell中的新文件中。你能帮忙吗

这是我正在看的。 文本文件(names.txt)包含如下名称

New York_USA
Delhi
Moscow
Tokyo
Austin_USA
Beijing
Chicago_USA
我正试图在一个单独的文件中获得与_USA的名称。 这是我试过的

#/bin/ksh
for city in "cat names.txt"
do
if ["$city" =~ "*_USA"]
then
echo "$city in USA" > USAnames.txt
fi
done 

您只需要执行
cat
命令而不是引用它,修复测试运算符([-->[[]),追加>>而不是覆盖>,并编写正则表达式而不是全局模式:

#/bin/ksh
for city in `cat names.txt`  # notice the back quotes
do
if [[ "$city" =~ .*_USA ]]
then
echo "$city in USA" >> USAnames.txt
fi
done 
更惯用的方式可能是:

#/bin/ksh
while read city 
do
if [[ "$city" =~ .*_USA ]]
then
echo "$city in USA" >> USAnames.txt
fi
done < names.txt
#/bin/ksh
读城市
做
如果[[“$city”=~.*U USA]]
然后
echo“$city in USA”>>USAnames.txt
fi
done
使用
awk
sed
会更容易

如果您希望输出如下所示

New York_USA in USA
Austin_USA in USA
Chicago_USA in USA
使用

sed

sed -n 's/\(.*\)_USA$/\0 in USA/p' names.txt > USAnames.txt
sed -n 's/\(.*\)_USA$/\1 in USA/p' names.txt > USAnames.txt
或者,如果您希望输出是

New York in USA
Austin in USA
Chicago in USA
使用

sed

sed -n 's/\(.*\)_USA$/\0 in USA/p' names.txt > USAnames.txt
sed -n 's/\(.*\)_USA$/\1 in USA/p' names.txt > USAnames.txt
编辑
您还可以使用perl打印出美国城市

#!/usr/bin/env perl
open(NAMES,  "names.txt");
    while (<NAMES>) {
    chomp;
    print "$_ in USA\n" if /_USA$/; # Chicago_USA in USA
    # print "$1 in USA\n" if /(.*)_USA$/; # Chicago in USA
}
close(NAMES);
!/usr/bin/env perl
打开(名称,“NAMES.txt”);
而(){
咀嚼;
如果/_USA$/;#芝加哥(美国)在美国,则打印“$uu在美国\n”
#如果/(.*)美国$/;#美国芝加哥,则打印“$1在美国\n”
}
结束(姓名);
只需使用grep:

grep '_USA$' your_file> new_file

谢谢你的回复。但是我尝试了这种方式。我根本没有得到任何输出。我假设if条件没有很好的定义。还有其他方法可以实现吗?我对代码做了一些编辑,再次检查,它现在应该可以工作了。你有多个问题…好的,修复了最后一个问题:在i中模式周围不应该有引号正如tripleee在评论中所说,如果你想要的话,有更简单的方法来实现你想要的。如果你真的坚持要重新格式化输出,为什么你不干脆
grep\u USA names.txt
?或者
sed-n's/\u USA$/&in USA/p'names.txt
?我现在正试图在perl中实现同样的效果。我像我一样使用正则表达式f($city=~m/^(_USA)/){print$city;}但没有得到输出。我不知道如何用perl获得
$city
。我已经用perl代码更新了我的帖子。